“对象的类型决定其操作”
第二章
1、在默认情况下,const对象被设定为尽在定义它的文件中有效(原因在C++ primer P54),如果需要在不同的文件中都有效,就必须在定义和声明前都加上extern。
//定义
extern const int bufferSize = 100;
//声明
extern const int bufferSize;
2、有一句话很有意思,“常量引用是对const的引用”,为何有意思?因为引用不是一个对象,它一旦绑定了一个对象,就不允许再修改绑定别的对象,这就有点常量那味了,所以从这层意思上理解有可以说所有引用都是常量,而常量引用实际上表达的是另一层意思,指这个引用指向一个常量。
3、常量引用可以与字面值常量绑定在一起,如下代码所示:
const int i = 10;
const int &r1 = i;
const int &r2 = 20;
/*
*上述代码相当于
*int temp = 20;
*const int &r2 = temp;
*/
const int &r3 = r1 * 20;
/*
*上述代码相当于
*int temp = 20;
*const int &r2 = temp;
*/
4、顶层const值指针本身是一个常量,底层const值指针所指向的对象是一个常量
5、constexpr非常有意思,与const不同,找天详细写写,P58-60
参考博文:C++11/14 constexpr 用法 - 简书
6、decltype的用法,像函数一样需要加括号,作用时使用括号中的变量或者表达式作为数据类型定义变量。
第三章
1、什么是拷贝初始化,什么是直接初始化?
当使用等号“=”来初始化变量,就是拷贝初始化,正确来时是执行拷贝构造函数创建对象。不使用等号就是直接初始化,直接初始化的范围比拷贝初始化大多了。
2、string使用下标进行随机访问,一道典型的空间换时间实例,十进制转换成十二进制
const string hex_digits = "123456789ABCDEF";
decltype(hex_digits.size()) n;
std::cin >> n >> std::endl;
if(n <= hex_digits.size())
{
std::cout << hex_digits[n-1] << std::endl;
}
else
{
std::cout << "input error" << std::endl;
}
3、vector表示对象的集合,也可称为容器。实际上它是一个模板,我们可以把模板看做是编译器对生成类或函数的编写的一份说明,<>中的信息就是他的说明信息,vector<int> ivec指ivec中保存的对象类型时int。从它的用法的角度看,我们可以把它看成是可变长数组
4、范围for语句不应改变其遍历序列的大小,原理类似迭代器中一旦改变了遍历序列的大小,其iterator.end()就不正确了,对vector进行push_back()后,迭代器就会失效
5、两个指针相减的数据类型是ptrdiff_t,一种标准库类型,因为结果可能是负值,所以ptrdiff_t是带符号的
6、强制类型转换有static_cast,、dynamic_cast、const_cast、renterpret_cast