序:Goole C++ style Guide;
无符号与带符号线程的结果会把带符号当成无符号计算
p17:带.h会使用C的标准库文件,部分IDE不支持C++程序带.h头文件
可以使用nullptr代替NULL(C++ 11 新标准)
使用两个指针判断相等,当一个地址指向某个对象,另一个指向相邻对象,判断的结果可能是true
p44:定义于任何函数体之外的变量被默认初始化为0,定义在函数体内部的内置变量将不被初始化。类的对象如果没有显式的初始化,则其值由类确定。
p55:const常量的引用必须是const对应类型的常量,对一般类型的常量引用必须是相应的内置类型,如果是变换类型C++内部机制会创建一个临时量对象,将引用指向临时 变量。const double *const p = &val;
p57:底层const指针可以变,但是顶层const不可以变
p59:const int sz = get_size(); 不是常量表达式,sz在具体运行之后才会得到具体的值 ,所以sz不是常量表达式,constexpr类型被用来验证变量的值是否是一个常量表达式,声明为constexpr的变量必须使用常量表达式初始化。
P59:constexpr变量的值必须在编译的时候就能得到,一般比较简单,显而易见,容易得到。constexpr指针必须指向固定的地址,例如函数外,
P60:contsexpr会把指针定义的指针对象置为顶层const;typedef double base,*p base是double同义词,p是double *的同义词,using SI = Sales_item; //使用别名的一种方法
P61:typedef char *pstring; const pstring *ps; //ps是一个指针,它的对象是指向char的常量指针。
p62:auto会自动忽略顶层const,保留底层const。可以为常量引用绑定到字面值上,非常量引用不可以。顶层const(值)是指const指向一个变量之后,变量的值不可随意改变,底层const(地址)是指const指向一个变量之后不可以随意更改对象变量。const int *const p;
p63:decltype可以获取一个对象变量的类型,得到这个类型可以规定变量的类型。r是一个引用,因此decltype(r)的结果是引用类型,r + 0这个表达式的结果是一个具体的值而非引用。decltype(*p)的结果类型是int &而非int decltype((i)) d d是int引用,decltype(i)一个未初始化的int
p79:无符号数和有符号数混合比较的时候,有符号数会转换为无符号数,例如n为负数,参与比较的时候,会将其转换为比较大的无符号数。
p82:for(declaration : expression) 表3.3cctype头文件中的函数
p83:数量变量的命名为 类型_cnt,遍历的新标准中的新方法。
p87:初始化vector对象的方法。
p89:一般括号构造vector对象,大括号构造列表,在大括号中的内容无法匹配的时候,编译器会尝试把大括号当成括号构造vector对象。
p95:可以使用auto定义迭代器
p97:如果容器对象是常量的,只能使用静态的迭代器 const_iterator
p98:容器的cbegin()函数返回常量迭代器
p99:不能在for循环中在vector对象之后添加元素。但凡是使用了迭代器的循环体,都不要先迭代器所属的容器添加元素(会使迭代器失效)。
p100:模板定义了迭代器的距离difference_type,为带符号整数
p102:数组的元素应为对象,因此不存在引用的数组。
p103:int *(&arry)[10] = ptrs; //arry是数组的引用,数组中的元素为地址
p104:缓冲区一处错误:下标越界并试图访问非法内存区域时,就会产生此类错误。
p105:int ia[10] auto ia2(ia); ia2是一个整型指针 decltype(ia) ia3;ia3是一个含有10个整数的数组
p106:begin函数返回指向数组的头指针,end函数返回数组的尾后指针,函数包含在iterator头文件中。一般函数在&nums[num_size]会得到尾后元素的地址
p107:两个指针相减的结果的类型为名为ptrdiff_t的标准库类型,包含在头文件cstddef头文件中
p108:内置的下标运算符所用的索引值不是无符号类型,与string和vector不同,int *p = ia + 2; p[-1] 是可以读出数据
p109:字符串数组的初始化时,没有将最后一位定位空格’\0’,则strlen函数会持续的读直至读出。
p111:可以将string类型通过c_str函数返回字符串指针,并初始化给另外的字符指针。后续改变s的值可能导致之前返回的数组不可用。
p113:int a[3][4] int (&aa)[4] = a[2]; //为引用a数组的第三行,数组引用
p114:for(auto &row : ia) for(auto &col : row){ col = ~ } //以此来处理数组中的每一个元素 要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。
p123:运算对象的调用顺序与优先级和结合律无关。一个表达式中顺序未规定的各个函数影响同一个对象时是一个错误的表达式。
p125:(-m)%n等于-(m%n) m%(-n)等于m%n
p127:在for auto循环中使用引用可以确保元素比较大时的高效率
p129:赋值发生的时用右侧运算对象{}加上数字,可以对vector进行赋值。不可以将指针的值赋给int。
p132:作者建议选择使用前置的递增版本。
p134:条件运算符判断可以嵌套
p135:条件运算符的优先级非常低,因此条件运算符表达式注意加上括号例如 cout<<((grade < 60) ? : “fail” : “pass”); 少任何一个括号都是错误
p137:unsigned表示在任何机器上位数都至少拥有32位,int型只能确保拥有16位。
p141:整型和浮点型算术运算会把整型转换为浮点型进行运算。
p142:如果无符号类型的所有值都能存在带符号类型中,则无符号类型的运算对象转换成带符号类型。如果不能,那么带符号类型的运算对象转换成无符号类型。long的长度取决于机器类型。
p143:指向任意非常量的指针都能转换成 void *;指向任意对象的指针都能转换成const void *
p144:强制类型转换的形式:cast-name(expression); cast-name是static_cast、dynamic_cast、const_cast、和reinterpret_cast
p145:任意非常量对象的地址都能存入void *,static_cast 用于把一个较大的算术类型赋值给较小的类型,此时此标志告诉程序的读者和编译器:我们知道并且不在乎潜在的精度损失。const_cast用来改变运算对象的底层const,去掉const性质,常用于有函数重载的上下文中。reinterpret_cast通常为运算对象的位模式提供较低层次上的重新解释。
p155:符合语句是指用花括号括起来的语句和声明的序列,符合语句也被称作块。一个块就是一个作用域。一个变量名字从定义初开始,一直到块的结尾为止。
p172:标签指示符可以和程序中的其他实体的标识符使用一个名字而不会收到干扰,goto语句和控制权转向的那条带标签的语句必须位于同一个函数之内。
p173:在程序中应该把处理对象的代码和用户交互的代码分离开来。
p174:runtime_error是标准库异常类型的一种,定义在stdexcept头文件中,初始化使用的是string对象或者一个C风格的字符串。
p175:异常抛出时,沿着程序的执行路径逐层回退,知道找到适当类型的catch子句为止。最终没能找到catch子句,系统会调用terminate的标准库函数。没有try语句块发生了异常也会调用terminate函数,并终止当前程序的执行。
p176:exception 和 stdexcept头文件定义了常用的异常类。我们只能以默认初始化的方式初始化exception、bad_alloc、bad_cast对象,不允许为这些对象提供初始值。其他类型的行为恰好相反。
p184:函数的个别形参不会被用到,则此类形参通常不命名以表示在函数体内不会使用它,但是是否命名形参不影响调用时提供的实参数量,不命名也要提供全部的实参。在函数内自动忽略函数体外的声明的对象,但是函数体外定义的对象存在整个执行过程中。
p191:void fcn (const int i ) void fcn (int i)是同一个函数,不是函数重载。参数是引用不可以绑定到字面值上。
p195:但是就可以把常量引用绑定到字面值上。f(int &arr[10]) 引用的数组 f(int (&arr) [10]) 数组的引用
p196:int(*matrix[10]) 声明指向含有10个整数的数组的指针
p197:传递给mian函数的参数第一个是字符串个数,第二个是命令字符串数组,第一个字符串是命令名,最后一个是0
p198:initializer_list可以用来表示参数个数可能会发生变化的参数,使用大括号括起来的字符串字面值或者字符串来进行初始化。类似于vector。类ErrCode可以用来表示不同类型的错误。
p199:···省略符形参通常用于C++访问某些特殊的C代码设置,这些代码使用名为varargs的C标准库功能。由编译器文档描述。一般放在参数列表的最后。
p202:返回局部对象的引用是错误的,即便是字符串字面值转换的局部临时对象。
p203:C++11标准规定函数可以返回花括号包围的值的列表,用来初始化容器。主函数返回值可以是EXIT_SUCCESS和EXIT_FAILURE两个预处理变量,可以保证与机器无关,被定义在cstdlib头文件中。
p205:typedef int arrT[10] arrT是一个类型别名,表示的类型是含有10个整数的数组。using arrT = int [10] arrT func(int i) func返回一个指向含有10个整数的数组的指针。 int (*func (int i )) [10]表示解引用func的调用将得到一个大小是10的数组,并且此数组的类型是int型。函数返回的是指向数组的指针。
p206:可以使用尾置返回类型表示函数返回的内容,auto func (int i)->int(*) [10]; func函数接收一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组。返回数组指针的函数定义方式可以是 int odd[] = {}; int even[] = {}; decltype(odd) *arrPtr(int i) { return (i % 2) ? &odd : &even; }
p208:一个拥有顶层const的形参无法和另一个没有顶层const的形参区分开来,但是如果形参是某钟类型的指针或者引用,则通过区分其指向的常量对象还是非常量对象可以实现函数重载,此时const是底层的。同时存在常量形参和非常量形参,当实参是非常量时编译器会优先选择非常量版本的函数。
p210:域和重载的关系中,同一般变量的声明相同,如果在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同的作用域无法重载函数名。
p211:在C++语言中,名字查找发生在类型检查之前。一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。调用含有默认实参的函数时,可以省略相关实参。
p212:调用默认实参的函数时, 只能省略尾部实参。
p213:用作默认实参的名字在函数声明所在的作用域内解析,这些名字的求值过程发生在函数调用时。
p214:constexpr函数是指能用于常量表达式的函数。函数的返回值和所有形参的类型都必须是字面值类型,而且函数中必须只有一条return语句。为了能在编译过程中随时展开,constexpr函数被隐式的指定为内联函数。constexpr函数中可以包含其他在执行时不执行任何操作的语句。例如空语句、类型别名、using声明。constexpr函数的参数和返回值必须是字面值类型。
p215:内联函数和constexpr函数可以多次定义,但是必须完全相同。 assert是一种预处理宏,所谓预处理宏其实是一个预处理变量,他的行为类似内联函数,包含在cassert头文件中。assert宏使用一个表达式作为它的条件:assert(expr); 首先对expr求值,如果表达式为假,assert输出信息并终止程序的执行。如果表达式为真,assert声明也不做。assert宏定义在cassert头文件中。
p216:如果定义了NDEBUG,则关闭调试状态,assert什么也不做 CC -D NDEBUG main.C #use / D with the Microsoft compiler。预处理器定义了几个用于调试的局部静态变量 __func__存放函数的名字 FILE 存放文件名 __LINE__存放行号 __TIME__存放编译时间 __DATE__存放编译日期
p217:void f(double , double = 3.14) 为含有默认值实参的函数的声明。
p218:选择重载的函数的原则:该函数的每个实参的匹配都不劣于其他的可行函数需要的匹配,至少有一个实参的匹配优于其他可行函数提供的匹配。
p220:有时候,即使实参是一个很小的整数值,也会字节将他提升成int类型,此时使用short版本反而会导致类型转换,char实参选择使用int形参的函数而非short形参的函数。重载函数的形参为float和double时,实参为一个小数时会出现二义性。所有算数类型的转换级别都一样。实参是非常量时,用非常量对象初始化常量引用需要类型转换,接受非常量形参的版本则与实参精确匹配,故应选择非常量形参函数。
p221:函数指针中函数的类型由返回类型和形参类型共同决定,与函数名无关。当我们把函数名作为一个值使用的时候,该函数会自动地转换成指针,即在函数名前面加不加取址符都一样。在指向不同的函数类型的指针间不存在转换规则。可以直接使用指向函数的指针调用该函数,无须提前解引用指针。bool (*pf)(const string &, const string &)
括号必不可少。
p222:void use( bool pf(const string &, const string &) ) 与 void use(bool (*pf) (const string &, const string &))是等价的,形参是函数函数类型,会自动地转换成指向函数的指针。decltype返回函数类型,不会将函数类型自动转换成指针类型。 typedef bool Func(const string&, const string&); typedef decltype(lengthCompare