本文章仅记录《C++面向对象程序设计》(第2版)书中个人认为的重点,基础知识点不做记录。 原书购买链接:C++面向对象程序设计
一.标识符
- 标识符可以由字母、数字以及下画线组成,但必须由字母或下画线开头,并且区分大小写字母
- 用户自定义的标识符中不能连续出现两个下画线,也不能以下画线紧连大写字母开头
- 定义在函数体外的标识符不能以下画线开头
二.初始化
1.拷贝初始化
2.直接初始化
-
直接初始化是将初始值写在一对圆括号中 类名 变量名(初始值); -
如果要初始化的变量是类类型的,例如一个平面坐标点Point类,初始值需要指定x和y轴两个坐标值,如(10,20),用"="的形式显然无法应对。 示例: Point location = 10, 20; //错误形式
Point location(10, 20); //直接初始化,正确
3.列表初始化
-
列表初始化的初始值由一对花括号括起,可以是一个值或多个逗号隔开的初始值列表 示例: int count{0};
Point location = {10,20}; //两个初始值
Point location{10,20}; //省略等号的形式
-
对内置类型来说,直接初始化和拷贝初始化没有差别,但列表初始化会有不同。如果使用列表初始化且初始值存在丢失信息的风险,编译器将报错 示例: long double ld=3.1415926536;
int a{ld}; //错误:从long double到int的窄化转换
int b={ld}; //错误:从long double到int的窄化转换
int c(ld); //正确
int d=ld; //正确
4.默认值
- 如果定义变量时没有指定初始值,即没有显式地初始化,则变量被默认初始化,此时变量被赋予默认值
- 在所有函数之外定义的内置类型变量,默认值为0
- 在函数体内部定义的内置类型变量,不被初始化,默认值是未定义的,访问未定义的值将引发错误
三.变量声明
-
变量声明的作用是使程序知道该变量的类型和名字。声明不会引起内存分配,程序中可以包含对同一变量的多个声明 -
如果在一个文件中定义了一个全局变量,其他的文件中要使用这个变量时就必须声明该变量 声明全局变量的格式为: extern 类型 变量名;
? 示例:
//module1.cpp
int k=2; //定义变量k,同时也是在module1.cpp中对k的声明
//module2.cpp
extern int k; //声明变量k,说明在在module2.cpp之外的某处有k的定义
int main()
{
int t=3; //定义变量t,也是对t的声明
k=t+2; //使用变量k
}
四.名字的作用域
-
同一作用域中不能重复定义相同的名字,但内层作用域中可以重新定义外层作用域已有的名字。此时,在内层作用域中,起作用的是内层作用域中的名字定义,外层作用域中的定义不再起作用,称为被隐藏。要显式访问全局变量,使用作用域解析符"::" 示例: int reused = 12; //reused有全局作用域
int main()
{
int unique = 25; //unique有块作用域
cout <<reused <<" " <<unique <<endl; //输出:12 25
int reused = 9; //块作用域内重复的reused
cout <<reused <<" " <<unique <<endl; //输出:9 25
cout <<::reused <<" " <<unique <<endl; //输出:12 25
}
五.const对象
-
程序中的有些数据是自始至终保持不变的,称为常量 -
const限定符可以将一个对象限定为只读的,在程序运行期间不能修改 const int Bufsize = 1024; 因为const对象的值不能修改,所以必须在定义时进行初始化,初始值可以是任意复杂的表达式 示例: const int size = getSize(); //正确:运行时用函数的返回值初始化size
const int a = 20; //正确:编译时初始化a
const int b; //错误:b未初始化
六.auto和decltype
1.auto类型说明符
? auto 变量名 = 初始值
2.decltype类型指示符
3.类型别名
-
typedef关键字 typedef 类别名 别名 -
using别名声明 using 别名 = 类型名
|