场景一 用于修饰指针 char greeting[] = "Hello"; char* p = greeting; // non-const pointer, non-const data const char* p = greeting; // non-const pointer, const data char* const p = greeting; // const pointer, non-const data const char* const = greeting; //…
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 3. 尽可能使用 const (Use const whenever possible) 1. const 与语义约束 const 允许指定一个语义约束(也就是指定一个"不该被改动"的对象),而编译器强制实施这项约束.它可以在 classes 外部修饰 global 或 namespace(见 Item2)作用域中的常量,或修饰文件.函数.或区块作用域…
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 2. 尽量以 const, enum, inline 替换 #define (prefer consts, enums and inlines to #define) 这个条款或许可以改为"宁可以编译器替换预处理器"比较好,因为或许 #define 不被视为语言的一部分. 对于 #define ASPECT_RATIO 1.653 记号名称 ASPEC…
Effective STL 笔记 – Item 6 ~ 7: Container and Object Pointer 中间两次笔记被删掉了,简单补一下: Item 3 中提到如果将对象直接放入容器中,可能会引发问题: 大量的拷贝行为要求对象的拷贝构造代价要小 试图将派生类放入存放基类的容器中会引发 Slicing 问题. 对此的简单方法就是在容器中保存对象 指针 ,但如果直接保存指针的话,我们需要自己维护和管理内存,容易混乱.最好的方法是保存 智能指针(smart pointer shared…
如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " hello"; char* p = greeting;  //non-const pointer,non-const data const char* p = greeting;  //non-const pointer,const data  声明p为一个指向常量的greeting的指针,p指向的对象…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 关键字const多才多艺,语法变化多端.关于const的基本用法,可以参见我的博客@http://www.cnblogs.com/hust-ghtao/p/3735941.html. 本篇博客主要讲了应用const时应该注意的地方. 1 令函数返回一个常量值 令函数返回一个常量值,往往可以降低客户因错误而造成的意外,而又不至于放弃安全性和高效性.例如有理数ope…
这个条目叫做,尽量使用编译器而不要使用预处理器更好.#define并没有当作语言本身的一部分. 例如下面的例子: #define ASPECT_RATIO 1.653 符号名称永远不会被编译器看到.它可能在源码到达编译器之前被预处理器移除.ASPECT_RATIO 最终不会进入符号表,如果因为这个常量的使用而导致编译错误,会使你非常迷惑,因为错误信息会指向1.653而不是ASPECT_RATIO.如果ASPECT_RATIO被定义在一个不是你自己写的头文件中,你会不知道1.,653来自哪里.,…
如果你对const足够了解,只需记住以下结论即可: 将某些东西声明为const可帮助编译器侦测出错误用法,const可被施加于任何作用于内的对象.函数参数.函数返回类型.成员函数本体. 编译器强制实施bitwise constness,但你编写程序时应该使用概念上的常量性(logical constness) 当const和non-const成员函数有实质等价的实现时,令non-const版本调用const版本可避免代码重复 关键字const允许你指定一个语义约束,即指定一个对象不被改动,编译器…
参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结 1.用于定义常量变量,这样这个变量在后面就不可以再被修改 const int val = 90; val = 100;   错误 2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改, 则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护 void f…
Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6. 若不想使用编译器自动生成的函数,就该明确拒绝 (Explicitly disallow the use of compiler-generated functions you do not want) 地产中介商卖的是房子,一个中介软件系统自然而然想必有个 class 用来描述待售房屋: cla…
Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 5. 了解 C++ 默默编写并调用哪些函数 (Know what functions C++ silently writes and calls) 当 C++ 处理过一个 empty class (空类)之后,其便不再是一个 empty class.如果你自己没有声明,编译器就会为它声明(编译器版本的…
Effective C++ Chapter 1. 让自己习惯C++ (Accustoming Yourself to C++) Item 4. 确定对象被使用前已先被初始化 (Make sure that objects are initialized before they're used.) 通常如果你使用 C part of C++ 而且初始化可能招致运行期成本,那么就不保证发生初始化.一旦进入 non-C part of C++, 规则有些变化.这就很好地解释了为什么 array (来自…
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.const 修饰成员变量 1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int a1=3; ///non-const data 5 const int a2=a1; ///const data 6 7 int * a3 = &…
Effective C++ Chapter 1. 让自己习惯C++(Accustoming Yourself to C++) Item 1. 视C++为一个语言联邦(View C++ as a federation of languages) 将 C++ 视为由四个次语言组成的语言联邦,在某个次语言中,各种守则与通例都倾向于简单.直观易懂.且容易记住.但从一个次语言移往另一个次语言,守则可能改变. C —— C++ 以 C 为基础.区块(blocks).语句(statements).预处理器(p…
前言 const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const. 但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能. 因此很多情况下 const 关键字的使用方法也不是简单的 const + 变量,其用法总的来说是比较灵活的. 指针的 const 关键字 const 关键字出现在 * 左边或是右边定义出来的指针完全不同. const int *pa = &a; 这样的一行代码定义了一个指向整型变量 a 的指针 pa…
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.const 修饰成员变量 #include<iostream> using namespace std; int main(){ ; ///non-const data const int a2=a1; ///const data int * a3 = &a1; ///non-const d…
const是常量的意思,它可以定义一个不可改变的量,主要用于以下几个地方: 1. 修饰变量,使之不可改变 举个例子: const int var = 3; 此时var的值就不能改变了.也正是因为const的变量不能轻易修改存储的值,所以在声明的时候就要初始化,这样就是不行的: const int var; 编译器就会报错. 2. 修饰指针 指针是特殊的变量,有时我们希望对它所指向的对象操作,而有时我们又希望对指针本身进行操作.同样,const应用于指针也有两个含义:一个是指向常量(指向的内容不可…
速度 #include <iostream> using namespace std; class TextBlock { private: string text; public: TextBlock(string s) { text = s; } const char& operator[](size_t position) const {return text[position]; } char& operator[](size_t position) {return t…
http://www.cnblogs.com/xudong-bupt/p/3509567.html C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的.如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助. 1.const 修饰成员变量 1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int a1=3; ///non-const data…
前言 const 关键字是常量修辞符,如果要告知编译器某个变量在程序中不会发生改变,则可将其声明为 const. 但,对 const 关键字的认识不能仅仅停留在这一层 - 它提供了很多更强大的功能. 因此很多情况下 const 关键字的使用方法也不是简单的 const + 变量,其用法总的来说是比较灵活的. 指针的 const 关键字 const 关键字出现在 * 左边或是右边定义出来的指针完全不同. const int *pa = &a; 这样的一行代码定义了一个指向整型变量 a 的指针 pa…
对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const,还有,两者都不指定为const: char *p = "hello"; // 非const指针, // 非const数据 const char *p = "hello"; // 非const指针, // const数据 char * const p = "hello"; // const指针, // 非const数据 const char…
尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率.…
class GamePlayer{private: static const int NumTurns = 5; int scores[NumTurns]; ...}; 万一你的编译器(错误地)不允许“static整数型class常量“完成”in class初值设定“,可改用所谓的”the enumhack" 补偿做法.其理论基础是:“一个属于枚举类型(enumerated type)的数值可权充ints被使用”,于是GamePlayer可定义如下: class GamePlayer{priva…
1.为什么搞出const关键字? const指定一个语义约束,指定一个对象不可修改.如果一个对象不可修改,就应该说出来. 2.const与指针 const可以修饰指向之物,也可以修改指针本身.STL中的迭代器是对指针的封装,因此,迭代器也有两个概念:指向常量对象的迭代器和常量迭代器. vector<int>::const_iterator; //指向常量的迭代器 const vector<int>::iterator; // 常量迭代器 3.const可以与方法产生关联,可以用在方…
条款7 辨别使用()与{}创建对象的差别 基础知识 目前已知有如下的初始化方式: ); ; }; }; // the same as above 在以“=”初始化的过程中没有调用赋值运算,如下例所示: Widget w1; // default ctor Widget w2 = w1; // copy ctor w1 = w2; // assignment, operator = 还可以用来初始化: class Widget { }; // fine ; // fine ); // error…
条款6 当推断意外类型时使用显式的类型初始化语句 基础知识 当使用std::vector<bool>的时候,类型推断会出现问题: std::vector<bool> features(const Widget& w); // OK ]; processWidget(w, highPriority); // ERROR auto highPriority = features(w)[]; processWidget(w, highPriority); // undefined…
条款5 相对显式类型声明,更倾向使用auto 基础知识 auto能大大方便变量的定义,可以表示仅由编译器知道的类型. template<typename It> void dwim(It b, It e) { while(b != e) { //typename std::iterator_traits<It>::value_type currValue = *b; // old type auto currValue = *b; // new type } } auto可以用来定…
条款四 知道如何看待推断出的类型 基础知识 有三种方式可以知道类型推断的结果: IDE编辑器 编译器诊断 运行时输出 使用typeid()以及std::type_info::name可以获取变量的类型信息,但是存在一些问题,代码如下: template<typename T> void f(const T& param) { using std::cout; cout << "T = " << typeid(T).name() <<…
条款三 了解decltype 基础知识 提供一个变量或者表达式,decltype会返回其类型,但是返回的内容会使人感到奇怪. 以下是一些简单的推断类型: ; // decltype(i) -> const int bool f(const Widget& w); // decltype(w) -> const Widget&, decltype(f) -> bool(const Widget&) struct Point { int x, y; } // decl…
条款二 了解auto类型推断 基础知识 除了一处例外,auto的类型推断与template一样.存在一个直接的从template类型推断到auto类型推断的映射 三类情况下的推断如下所示: // case 1 const auto& rx = x; // rx -> int // case 2 auto&& uref1 = x; // uref1 -> int& auto&& uref2 = cx; // uref2 -> const in…