C++语法学习(14a)
一、插入和提取运算符
<<:插入,将其右侧的数据插入到左侧的输出流中,同时返回输出流本身,以备连用。
>>:提取,从其左侧的输入流中读取数据保存到右侧的变量中,同时返回输入流本身,以备连用。
二、C++中的函数
1.重载:在相同作用域中,可以定义同名的函数,但是它们的参数必须有所区分,这样的函数构成重载关系。
调用函数时,编译器将根据实参与形参的匹配程度,自动选择匹配最优的重载版本。
C++编译器是通过对函数进行换名,将参数表的信息整合到函数中,实现函数重载与名字冲突的矛盾。
通过在函数声明中加入extern "C"要求C++编译器不对函数做换名,以方便C语言程序调用该函数。但
是这样的函数无法重载。
2.缺省参数何哑元
可以为函数的部分或全部形参指定缺省值,调用该函数时,如果不给实参,就取缺省值作为相应形参的值,否则就取实参的值。
如果某个参数带有缺省值,那么它右侧的所有参数必须都带有缺省值。
函数的参数可以只有类型而没有名称——哑元。(用于实现重载或者向前兼容)
3.内联函数
用函数定义的二进制代码替代函数调用语句,避免函数调用的开销,优化程序的执行性能。
大多数编译器对于频繁调用的简单函数会自动进行内联优化。
在函数声明中显式加入inline关键字,要求编译器对该函数做内联优化。
编译器有权拒绝内联要求:复杂函数,递归函数,虚函数。
三、引用
1.引用即别名。别名不占内存
int a = 10;
int& b = a;//定义b是整型参数a的别名——引用
2.引用型参数
一个函数引用型参数实际上就是调用者实参的别名。对该参数的修改将直接影响实参的值。
分析类型的时候有个规则,从近到远,从右到左,括号优先。
1)通过函数的引用型参数可以修改实参的值。
2)通过向函数传递引用型参数,避免数据拷贝的开销。如果该函数不需要修改实参的值,那么最好使用常引用形式的形参,
以防止在函数对实参进行意外的修改。(const)
3.引用型返回值
1)不要从函数中返回对局部变量的引用。
2)可以返回对全局变量、静态局部变量、实参变量、动态分配的内存、成员变量的引用。
4.引用是一种非实体类型,在高级语言的层面上,不占用内存,但是编译器会通过指针实现对引用的操作,因此在
性能上与指针相当。
5.引用和指针在很多方面具有相似的特效和功能,但还是有些差别:
1)指针可以不做初始化(野指针),但是引用必须初始化。
2)指针的目标可以修改,但是引用的目标不可修改。
3)可以定义指向指针的指针,但是不能定义引用引用的引用。(引用是一种非实体类型,没有地址)
4)可以定义引用指针的引用,但是不能定义指向引用的指针。(引用是一种非实体类型,没有地址)
5)可以定义指针数组,但是不能定义引用数组,可以定义数组的引用。
int arr[] = {1,2,3};
int (&rarr)[3] = arr;
四、显示类型转换和类型转换操作符
C语言的显示类型转换:(目标类型)源类型变量。 强制类型转换
C++语言显示类型转换,在C风格的基础上增加四种操作符形式:
1.静态类型转换:static_cast
目标类型变量 = static_cast<目标类型>(源类型变量);
char C = static_cast<char>(n);// int n;
如果在源类型和目标类型之间有一个方向可以做隐式类型转换,那么在另一个方向上就可以做静态类型转化。
char -隐式-> int
char <-静态- int
double -无法隐式-> int
double <-无法静态- int
使用场景:
int* pn = &a;
void* pv = pn;//任何类型指针都可以隐式转换伟void*
pn = static_cast<int*>(pv);
2.动态类型转换:dynamic_cast
用于多态性的父子类型的对象指针或引用之间。
3.
浙公网安备 33010602011771号