-
命名空间
- 定义
namespace example {
...
} - 使用
使用using namespace + 命名空间;
使用using 命名空间::变量名/函数名;
- 定义
-
基本输入输出
C++使用steam进行输入输出
cin、cout、cerr、clog
注:cin不支持空格和回车字符串的输入,请使用getchar()函数。
-
内联函数
C++内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。
如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。- 在内联函数内不允许使用循环语句和开关语句,内联函数内部有循环和开关,也不会出错,但是编译器会把它当做非内联函数的。
- 内联函数的定义必须出现在内联函数第一次调用之前;
- 类结构中所在的类说明内部定义的函数是内联函数。
- 内联函数的声明是不需要加inline关键字的,内联函数的定义是必须加inline的
注:
- 在类定义中的定义的函数都是内联函数,即使没有使用 inline 说明符。
- 对于内联函数,程序只是提供了一个“内联建议”,即建议编译器把函数用内联展开,但是真正是否内联,是由编译器决定的,对于函数体过大的函数,编译器一般不会内联,即使制定为内联函数。
-
函数重载
在同一作用域内,同名函数的形式参数(参数的个数、类型或者顺序)不同,调用时编译器会通过参数进行比较,选择最合适的定义(称为重载决策)。
注:函数的返回类型不能作为重载的依据。
函数签名:函数的名称及其参数类型组合在一起,就定义了一个唯一的特性,称为函数签名(不包括返回类型)。
-
缺省参数
-
C++允许在定义函数时给其中的某个或某些形式参数指定默认值,这样,当发生函数调用时,如果省略了对应位置上的实参的值时,则在执行被调函数时,以该形参的默认值进行运算。
float area(float r=6.6); area( ); //相当于area(6.6);
-
实参与形参的结合是从左至右顺序进行的。因此指定默认值的参数必须放在形参表列中的最右端,否则出错。
-
一个函数不能既作为重载函数,又作为有默认参数的函数,会出现二义性。
-
默认参数一般在函数声明中提供。如果程序中既有函数的声明又有函数的定义时,则定义函数时不允许再定义参数的默认值。
-
-
副作用
表达式有两种功能:每个表达式都产生一个值( value ),同时可能包含副作用( side effect ),副作用是指改变了某些变量的值。
-
类型转换
-
隐式类型转换
-
显示类型转换
-
(type)var,这种C风格的强转不推荐使用。
-
explicit关键字
-
static_cast <new_type> (expression)
static_cast强制转换只会在编译时检查,但没有运行时类型检查来保证转换的安全性。同时,static_cast也不能去掉expression的const、volitale、或者__unaligned属性。
-
dynamic_cast <new_type> (expression)
new_type 必须是一个指针或引用或“指向 void 的指针”。 如果 new_type 是指针,则expression 的类型必须是指针,如果 type-id 是引用,则expression为左值。 如果转型失败会返回null(转型对象为指针时)或抛出异常(转型对象为引用时)。dynamic_cast 会动用运行时信息(RTTI)来进行类型安全检查,因此dynamic_cast 存在一定的效率损失。
-
const_cast <new_type> (expression)
new_type 必须是一个指针、引用或者指向对象类型成员的指针。
const_cast用于去除除对象的const或者volatile属性。
-
reinterpret_cast <new_type> (expression)
new_type必须是一个指针、引用、算术类型、函数指针或者成员指针。其转换结果与编译平台息息相关,不具有可移植性,因此在一般的代码中不常见到它。reinterpret_cast 常用的一个用途是转换函数指针类型,即可以将一种类型的函数指针转换为另一种类型的函数指针,但这种转换可能会导致不正确的结果。
-
-
-
整型提升Integral promotion
- 把小整数类型转换成较大的整型类型 bool、char、signed char、unsigned char、short和unsigned short等类型来说,只要它们所有可能的值都能存在int里,它们就会提升成int类型;否则,提升成unsigned int类型。
- 较大的char类型(wchar_t、char16_t、char32_t)提升成int、unsigned int、long、unsigned long、long long 和unsigned long long中最小的一种类习惯,前提是转换后的类型要能容纳原类型所有可能的值。
如果某个运算符的运算对象类型不一致,这些运算对象将转换成同一类型。但如果某个运算对象的类型是无符号类型,那么转换的结果就要依赖于机器中各个类型的相对大小了。
- 情况1:整型提升,如果大家提升后的类型一致,则无需进一步转换,这种情况下其实要注意是否可能溢出;如果提升后的整型都是一致的符号,那么小类型的运算对象转换成较大的类型。
- 情况2:无符号和有符号类型运算,如果无符号类型大于或等于带符号类型,那么带符号的运算对象会转换成无符号的,这会带来很多副作用,例如比较两个整型,可能产生相反的结果。
- 情况3:如果有符号的类型大于无符号的类型,此时转换的结果依赖于机器:如果无符号类型的所有值可以被该有符号类型表示,那么无符号类型的运算对象转换成有符号类型,否则,有符号类型的运算对象转换成无符号类型。
-
引用
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
int i int &r =i;