- 开篇第一句话足见作者的高屋建瓴:类型决定程序中数据和操作的意义。随后列举了简单语句
的意义取决于i和j的类型。若它们都是整形,则为通常的算术意义。若它们都为字符串型,则为进行拼接操作。若为用户自定义的class类型,则…i = i + j;
- C++中的基本类型(primitive)有很多,但主要分为两类:arithmetic types和void。而arithmetic types也分成两类:integral types和floating-point types。
- 类型long long是C++11的新特性。
- 通常float-point type中,各个类型的表示大小:float用一个word,double用两个word,而long double用三或四个word。
- 算术计算时不要使用char,因为char在一些机器上表示为signed char,而在另外一些机器上用unsigned char表示。
- 避免未定义和依赖具体实现的行为:
- 将该type能够表示的数据范围之外的value赋值给该type时,会根据signed/unsigned进行处理:
- 关于转义序列的泛化:
- 关于变量(对象)的初始化和赋值:简单理解,比较对于自定义的类而言,初始化操作调用的是拷贝构造
copy constructor
,而赋值操作调用的是operator=
。 - 内置类型和class类型没有(显式)初始化的后果:
- C++中变量(对象)必须先declaration后使用的原因是C++是一门静态类型语言,在编译阶段会进行(静态)类型检查。
- scope的阐述:纠正:这里说大部分作用域用
{
}
\{\}
{}限定,例如
for(int val = 0; val < 10; val ++) {}
中,val的作用域就不是用 { } \{\} {}限定。 - 引用(reference)必须初始化:
- 引用不是对象,而是已存在对象的别名:
- reference 和 pointer:
void *
指针:
似乎void *
指针是个万金油,但是- 关于复合类型(compound type) 的良好定义方式:
- 指针引用(reference to pointers)和指向引用的指针(pointer to a reference): 因为引用不是对象,它仅是已经存在对象的别名。所以指向引用的指针是语法错误。然而指针是一个对象,所以我们可以定义指针引用:
- 默认情况下,const objects are local to a file: ,实例:,具体解释:
- reference to const: 当然这里定义引用的const属于引用的一厢情愿。
- 与reference to const类似,指针具有pointer to const:
- 注意:const reference 是 reference to const的缩写,而const pointer 和 pointer to const是两码事!
constexpr
关键字初探:- pointers, const和type aliases混合使用会产生一些迷惑性的错误:这里不可简单将别名展开分析const,当然,这里尽可能少的组合使用type alias和const。
- auto type specifier: (感觉自动类型推导很迷糊),关键论述为: auto tell the compiler to deduce the type from the initializer。
- 关于header guards:,这个功能能够防止在一个文件中多次包含相同的头文件,从而防止多重定义。多写,然后养成习惯。
章节总结:
- type是C++的基础,它规定了能够表示的data以及进行的操作。C++不仅仅提供了贴合机器的built-in类型,也能够让开发者自由的定义专属于自身需求的type。