1、C++中的const

(1)、C++中的const是真正的常量,可以进行数组大小的定义;

代码如下:

#include<iostream>usingnamespacestd;#defineA10intmain(void){inta=10;intarray[a];//Linux内核支持这样定义数组,其他的编译器不支持constinta=10;//这里是常量,所以可以进行下面的数组大小的确定;intarray[a];//任何平台都是对的,const编译时,执行;return0;}


(2)、C++中常引用时,必定开辟了新的内存空间;

代码如下:

#include<iostream>usingnamespacestd;intmain(void){//int&b=10;//普通引用,引用一个常量,常量没有内存地址,引用就是给内存取多个别名;constint&b=10;//C++编译器会为其分配内存空间;}


(3)、const在函数后面修饰的本质:void fun(int a) const;

本质:void fun(const Teacher * const this, int a){},就是修饰的是*this;


2、引用的本质

引用的本质:引用在C++中的内部实现是一个常指针;C++编译器帮我们程序员取了一个地址;

Type &name <===> Type * const name;

(1)、代码如下:

#include<iostream>usingnamespacestd;structTeacher{charname[64];intage;int&a;//很像指针所占用的内存空间大小;int&b;};//普通引用占内存空间,和指针所占空间大小是一样的;//引用的本质:引用在C++中的内部实现是一个常指针;C++编译器帮我们程序员取了一个地址;//Type&name<===>Type*constname;intmain(void){cout<<sizeof(Teacher)<<endl;return0;}//一般int返回,返回的是变量的值;//一般int&,引用返回的是变量本身;函数可放左边/右边;//用引用作为返回值的话,其返回的空间不能是临时空间;//g2()=100;可以作为左值,因为引用返回的是一段连续的存储空间,是变量;//函数作左值,必须返回一个引用;

(2)、运行结果:


原因:因为我用的是64位的,所以指针8字节,还有字节对齐,是其中最大基础数据类型字节的整数倍,此处应该为8的整数倍;


3、C++的内联函数

(1)、内联函数必须和函数体的实现写在一块;
(2)、内联函数直接将函数体插入在函数调用的地方;
(3)、内联函数速度更快,没有压栈,调转,返回等额外开销;
(4)、内联函数中不能有循环语句,不能存在过多的条件判断语句;
(5)、内联函数只是一种请求,C++编译器不一定允许这种请求;

代码如下:

#include<iostream>usingnamespacestd;inlinevoidprintA(){//内联函数让C++做特殊处理;inta=10;cout<<"a="<<a<<endl;}//内联函数替代宏代码片段;inlineintmain(void){printA();return0;}


4、C++中的默认参数

(1)、代码如下:

#include<iostream>usingnamespacestd;//没传参数,就使用默认参数;intprintfA(inta=1){cout<<a<<endl;}intprintfA_1(inta,intb,intc=1){}//C++中允许函数有默认参数//默认参数规则:从左边开始,如果默认参数出现,那么接下来的(右边)都必须是默认参数;intprintA_2(inta=1,intb=2,intc){}intmain(void){printfA();return0;}

(2)、运行结果:

默认参数规则:从左边开始,如果默认参数出现,那么接下来的(右边)都必须是默认参数,否则报错!!


5、占位参数和默认参数

(1)、代码如下:

#include<iostream>usingnamespacestd;//函数占位参数:函数调用时,必须写够参数;voidfunc1(inta,intb,int){cout<<"a"<<a<<"b"<<b<<endl;}//默认参数和占位参数//目的:为以后的程序留下扩展;voidfunc2(inta,intb,int=0){//这个函数既是默认参数,也是占位参数;cout<<"a"<<a<<"b"<<b<<endl;}intmain(void){//func1(1,2);占位参数此时必须为3个,所以错误;//func1(1,2,3);对func2(1,2);//占位和默认参数,2/3个参数都是可以的;func2(1,2,3);//此时第3个参数没有什么意思,不能使用;return0;}