C++ Primer总结
1、如果反斜杠\后面跟着的八进制数字超过3个,只有前3个数字与\构成转义序列。例如\123
2、同样的\x要用到后面跟着的所有数字。\x12346213
3、变量只能定义一次,但是可以被多次声明。
4、指针和引用的区别:
1)引用是另一个对象的别名,而指针本身就是一个对象。
2)引用必须初始化,并且一旦定义了引用就无法再绑定到其他对象。而指针无须在定义时赋初值,也可以重新赋值让其指向其他对象。
5、getline(cin, word)函数遇到空格符不会停止,输入一行数据,即遇到换行符结束,字符串word不包括换行符。
6、string a("hello"); for (auto &c, str); 意思是循环遍历字符串a的每个字符。存储在c中,自动初始化为下一个字符。
7、vector和string对象的下标运算符可用于访问已存在的元素,而不能用于添加元素。
8、int &val = 10; (错误,引用只能绑定在对象上,而不能与某个字面值或表达式的计算结果绑定在一起)
const int val = 10; (正确,允许一个常量引用绑定非常量对象、字面值、甚至是个一般表达式)
9、重复声明例子(错误):
Record lookup(Phone a)
Record lookup(const Phone a)
Record lookup(Phone *a)
Record lookup(const Phone a)
Record lookup(Phone &a)
Bool lookup(const Phone a)
对于接受指针或引用的函数来说,对象是非常量还是常量对应的形参不同。(构成重载)
Record lookup(Account &a)
Record lookup(const Account &a)
Record lookup(Account *a)
Record lookup(const Account *a)
10、声明函数时,一旦某个形参被赋予了默认值,那么它之后的形参都必须要有默认值。
11、局部变量不能作为默认实参。(static静态数据成员同样不能作为默认实参)
sz wd = 80; char def = ' '; sz = ht();
string screen(sz = ht(); sz = wd; char = def);
void f2()
{
def = '*'; //改变了默认实参的值
sz wd = 100; //隐藏了外部定义的wd,但是没有改变默认值,因为是新创建的局部变量,无法改变默认值。
window = screen(); //调用screen(ht(), 80, '*')
}
12、封装的优点:
1、确保用户代码不会无意间破坏封装对象的状态。
2、被封装的类的具体实现细节可以随时改变,而无需调整用户级别的代码。
13、一个const成员函数如果以引用的形式返回*this,那么它的返回类型将是常量引用。
14、关联容器(与顺序容器的本质区别在于:关联容器是通过键(key)存储和读取元素的,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
15、在顺序容器中可以用c.front()和c.back()分别以返回引用的形式访问容器的头元素和尾元素。(注意使用前需要检验容器是否为空,即 !c.empty())。
16、如果往容器中调用insert(给定位置begin,值vec)函数,会在begin的位置之前插入值vec,并返回新增值位置。
而erase()函数则是返回擦除元素的下一位迭代器。
17、s.substr(pos, n)返回一个string,包含s中从pos开始的n个字符的拷贝。
s.append("good")将“good”追加到字符串末尾。
s.replace(pos, n, “good”)把字符串s中的pos位置开始的3个字符替换成候选字符串“good”。
18、拷贝初始化发生的条件:
a.我们在使用=号定义变量时。
b.将一个对象作为实参传递给一个非引用类型的形参。
c.从一个返回类型为非引用类型的函数返回一个对象。
d.用花括号列表初始化一个聚合类中的成员。
e.初始化标准容器库或调用其insert()或push_back()函数。
19、在一个构造函数中,成员的初始化是在函数体执行之前完成的,且按照成员在类中出现的顺序进行初始化。
在一个析构函数中,首先执行函数体,然后销毁成员。成员按照初始化的顺序逆向销毁。
20、当指向一个对象的引用或指针离开作用域时,析构函数不会执行。
21、StrblobPtr& operator++(); 前置运算符,返回对象的引用。
StrblobPtr operator++(int); 后置运算符返回对象的值。(int 用来区别前置和后置运算符)
22、#define swap(x,y)\ swap(x,y)\
x = x^y;\ (x) = (x) + (y);\
y = x^y;\ (y) = (x) - (y);\
x = x^y; (x) = (x) - (y);