C++ Primer第一、二章
第一章 开始
具体内容点击查看
输入输出流
控制流:if/while/for
类简介
第二章 变量和基本类型
基本内置类型
具体内容点击查看
- unsigned int 可以缩写为 unsigned
- 当赋给无符号类型一个超出它表示范围的值时,结果为初始值对无符号类型表示数值总数取模后的余数。
变量
具体内容点击查看
变量的定义
初始化变量的方法
1 | int a = 0; |
变量的声明和定义的关系
extern关键字
1 | //c++是一种静态类型语言,指其在编译阶段检查类型。检查类型的过程称为类型检查。 |
标识符
标识符
标识符由字母、数字、下划线组成,且不能以数字开头。
不能连续出现两个下划线,不能以下划线紧连大写字母开头,定义在函数体外的标识符不能以下划线开头
名字的作用域
名字的作用域
1 | //作用域允许嵌套,且允许内层作用域中重新定义外层作用域已有的名字 |
复合类型
具体内容点击查看
引用
引用
1 | //引用不是对象,只是对象的一个别名 |
指针
指针
与引用类似。指针也实现了对其他对象的间接访问
与引用不同。其一,指针是一个对象,可以进行赋值、拷贝,并可先后指向不同的对象。
其二,指针无须初始化。
1 | //指针存放着它所指向对象的地址,通过取地址符&来获取地址 |
1 | //使用解引用符*来访问指针所指的对象 |
得到空指针的三种方法
1 | int *p = 0; |
赋值永远改变的是等号左侧的对象
1 | p = &ival;//pi的值变成了ival的地址,现在p指向了ival |
void*指针是一种特殊的指针类型,能存放任意类型对象的地址
1 | double obj = 3.14, *pd = &obj; |
理解复合类型的声明
理解复合类型的声明
1 | //变量的定义包括一个基本数据类型和一组声明符。虽然基本数据类型只有一个,但声明符的形式可以不用 |
指向指针的指针
1 | //声明符中的类型修饰符的个数没有限制,而指针也是对象,所以就有指向指针的指针 |
指向指针的引用
1 | //从右往左读r的定义,来区分r的类型是什么 |
const限定符
具体内容点击查看
const的特性仅仅在执行改变const对象内容的操作时才会发挥作用,所以const对象可以执行除了改变内容的所有操作;
默认状态下,const对象仅在文件内有效;如果想在多个文件内共享const对象,必须在变量的定义之前添加关键字extern。
const的引用
const 的引用
1 | //”对const的引用“被称为“常量引用” |
初始化和对const的引用(常量引用)
1 | //前面强调,引用的类型必须与引用对象的类型一致,但存在两个例外。 |
对const的引用可以引用一个非const的对象
1 | int i = 42; |
指针和const
指针和const
指向常量的指针不能用于改变其所指对象的值,同样,要想存放常量对象的地址,只能使用指向常量的指针
1 | disk double pi = 3.14; |
但是一个指向常量的指针可以指向一个非常量对象,与引用类似,仅仅不能通过该指针改变对象的值,但可以通过其他途径改变
所谓指向常量的指针和引用,只不过是指针或引用“自以为是”罢了, 它们认为自己指向了常量,所以约束自己不去改变对象的值
指针是对象,所以也存在const指针
1 | int errNumb = 0; |
注意,常量指针不代表该指针所指向的对象是常量,所以可以通过常量指针来修改指向对象的值(非常量对象)
顶层const
顶层const
顶层const可以表示任意的对象是个常量
底层const表示指针(引用)所指(绑定)的对象是一个常量
1 | int i = 0; |
当执行对象的拷贝操作时,顶层const几乎不受影响,但底层const却有诸多限制。
执行对象的拷贝操作时,拷入拷出的对象必须具有相同的底层const资格,或两个对象的数据类型能够转换。(非常量可以转换成常量)
1 | i = ci;//正确 |
constexpr和常量表达式
constexpr和常量表达式
- c++11新标准中,可以将变量声明为constexper类型以便编译器来验证变量的值是否是一个常量表达式
- 声明为constexper的变量一定是一个常量,而且必须用常量表达式初始化。
- 引用和指针也能定义成constexper,但初始值只能是nullptr、0、或是存储于某个固定地址中的对象
- 在constexper声明中如果定义了一个指针,限定符constexper仅对指针有效,与指针所指的对象无关
1 | disk int *p = nullptr;//p是一个指向整型常量的指针 |
处理类型
具体内容点击查看
类型别名
类型别名
两种方法定义类型别名。
传统的方法是使用关键字typedef:
1 | typedef double wages;//wages是double的同义词 |
c++新标准规定了一个新方法:使用别名声明来定义类型的别名
1 | using SI = Sales_item;//SI是Sales_item的同义词 |
特别注意,当类型别名指代的是复合类型或常量时别名所指代的数据类型是什么
1 | //typedef char *pstring; |
由于别名声明的是一个指向char的常量指针,声明语句中用到pstring时,基本数据类型是指针!
auto类型说明符
auto类型说明符
c++新标准中引入了auto型说明符,作用是让编译器来判断表达式所属的类型
auto也可以在一条语句中声明多个变量,前提是所有变量的基本数据类型一致
1 | auto item = val1 + vall2;//item初始化为val1和val2相加的结果 |
- 当auto类型用来定义复合类型时,auto通常会忽略顶层const,并保留底层const
1 | disk int ci = 0, &cr = ci; |
decltype 类型指示符
decltype类型指示符
c++11新标准引入第二种类型说明符: decltype
decltype 让编译器分析表达式并得到它的类型,但也仅仅是得到类型,而不实际计算表达式的值
1 | decltype (f()) sum = x;//sum的类型为函数f()的返回类型 |
- 与auto不同,decltype返回的类型包括了顶层const和底层const
decltype和引用
特别的,引用一向作为对象的同义词出现,除了在decltype这里被返回时返回的是引用类型
decltype与auto的另一重要区别是:decltype的结果类型与表达式的形式密切相关
- 如果decltype()中的变量名加上了括号,那decltype((variable))的结果将永远是引用类型,而不加括号decltype(variable)的结果只有当variable本身是引用时才是引用
1 | int i = 0; |
自定义数据结构
具体内容点击查看
详情请看 c++primer p90~93
预处理器
预处理器
1 | 预处理器是用来确保头文件多次包含仍能安全工作的常用技术 |
c++primer 第三章请点击下方的站内链接






