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.

 

posted on 2018-03-27 23:29  enjoyzhao  阅读(122)  评论(0)    收藏  举报

导航