c++Primer再学习(1)

记录再学习过程中,对c++primer各章节中的一些之前不明白或是忽略的知识点的笔记。

第一~七章

1.在头文件中,必须总是使用完全限定的标准库名字
2.不要把string::size()的返回值赋给一个int的变量,而应使用string::size_type。同样的道理,string对象的索引变量最好也用string::size_type
3.在多数计算机上,任何一个大写字母都小于任意的小写字母
4.end操作返回的迭代器不指向任何元素,因此不能对它解引用或自增操作。但值不为空
5.任何改变vector长度的操作都会使已存在的迭代器失效
6.string对象和bitset对象之间是反向转化。 string对象的最右边字符用来初始化bitset对象的低阶位
7.数组维度在c++11标准中可以使用constexpr声明定义的编译期常数,其他标准是不合法的
8.如果对左操作数进行解引用,则修改的是指针所指对象的值;如果没有使用解引用操作,则修改的是指针本身的值
9.声明定义一个指针是会分配内存的,而引用是变量的别名不分配内存
10.const在*的左侧则声明的是指针所指对象不能被修改(无论所指对象是否const) const在*右侧则声明的是指针本身常量无法被修改,而其所指对象可被修改
11.c风格字符串是以'\0'(null)结尾的字符数组
12.标准库函数strlen计算c风格字符串中的字符个数,不包括null结束符
13.指向数组的指针  T (*variable_name)[array_size]  <=> typedef T <typename>[array_size]; <typename> *variable_name = xx;
View Code
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int ia[3][4] = { {1,2,3,4}, {5,6,7,8}, {9, 10, 11, 12}};
 7     int (*p)[4] = ia;
 8     for(; p != (ia + 3); ++p)
 9     {
10         for(int *q = *p; q != (*p + 4); ++q)
11         {
12             cout << *q << " ";
13         }
14         cout << endl;
15     }
16     
17     int ib[4] = { 1, 2, 3, 4};
18     int *ip[4] = { &ib[0], &ib[1], &ib[2], &ib[3]}; // 可看成是 int*  ip[4]; ip是一个含有4个int*成员的数组
19     for(int i = 0; i != 4; ++i)
20     {
21         cout << ip[i] << endl;
22     }
23     return 0;
24 }
14.对于位操作符,由于系统不能确保如何处理其操作数的符号位,所以应使用unsigned整型操作数
15.& 全1为1; |全0为0; ^不同为1;
16.后自增或后自减操作优先级高于解引用(*)操作符
17.sizeof(expr) ,获得该表达式的结果的类型长度,而不计算表达式expr的值。
18.assert  #include <cassert>只有在未定义NDEBUG时才有效,在定义了NDEBUG的代码中,assert不做任何工作,因此没有运行时代价,也不会在运行时做任何检查。所以不能用来代替运行时的逻辑检查,也不能代替对程序可能产生的错误的检测
19.将不需要修改的引用形参定义为const引用。普通的非const引用形参,既不能用const对象初始化,也不能用常量字符串或产生右值的表达式实参初始化
20.形参从右向左理解 int*& i -》理解为 int*  &i  i是一个int指针的引用
21.应避免使用vector等容器类型的非const形参,而使用迭代器作为形参传递
22.通过引用传递数组,不复制,传递引用。编译器检查数组实参的大小与形参的大小是否匹配 形参名与&必须以(),因为[]下标操作符优先级高于&
23.多维数组形参以数组名传递且其他维必须明确大小。例: void print(int (*arr)[10], int row)     *arr的括号是必需的 。编译器会忽略多维数组形参中的第一维大小 void print(int arr[][10], int row)
24.如果函数的返回值类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。当函数返回非引用类型时,其返回值即可以是局部对象,也可以是求解表达式的结果
25.千万不要返回局部对象的引用,千万不要返回局部对象的指针
26.在头文件中加入或修改内联函数时,使用了该头文件的所有源文件都必须重新编译
27.const对象,指向const对象的指针或饮用只能用于调用其const成员函数,如果尝试用它们来调用非const成员函数则是错误的。非const的对象即可以调用类的const成员函数也可以调用非const成员函数。
28.编译器生成的默认构造函数不会自动初始化内置类型的成员
29.函数指针可以作为函数的形参。两种编写形式
void useBigger(const string&, const string&, bool (*)(const string&, const string&) );
void useBigger(const string&, const string&, bool (const string&, const string&) );
30.返回指向函数的指针。从声明的名字开始由里向外理解
原文地址:https://www.cnblogs.com/neking/p/2825563.html