关于C++引用的九点说明

mac2026-09-22  12

前言: 除了5、6点这两个特殊情况外,引用的类型必须其所引用的类型一致。

C++引用:

1)引用是基本数据类型(int,float,double,long,long long)与变量名(a,b,c...)中加了一个类型修饰符&,这个变量表示为一个引用。测试代码如下:

int i=0; int &j=i;//这里的j表示为一个引用

2)引用与它所绑定的对象共用一块内存空间,也就是这块内存空间拥有两个名字,修改其中一个名字存放的值,另一个也会更新到这个新值。测试代码如下:

int a=1,&b=a; cout<<&a<<" "<<&b<<endl;//二者的地址一样,表示这块内存空间拥有两个名字 a=2; cout<<a<<" "<<b<<endl;//通过其中一个变量修改内存存放的值,二者的值都会更新

3)引用只能绑定一个对象,也就是说一但引用绑定初始对象,那么它就一直和初始对象绑定在一起,无法令引用绑定新的对象,因此引用必须初始化。测试代码如下:

int &a; //报错:引用变量a需要初始值设定项

4)普通引用与其绑定对象的类型必须严格匹配,也就是说普通引用不能绑定字面值或某个表达式的计算结果。测试代码如下:

int &a=1; //错误:引用类型的初始值必须是一个对象 double b=1.0; int &c=b; //错误:此处引用的对象必须要为一个int类型对象

5)const引用在初始化的时候允许任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。也就是说const引用可以绑定非常量的对象、字面值、甚至是一个一般表示式。测试代码如下:

int i=42; const int& r1=i; //正确:允许const引用绑定导一个普通int对象上 const int& r2=42; //正确:允许const引用绑定一个字面值 const int& r3=r1*2; //正确:允许const引用绑定一个一般表达式的结果 int& r4=r1*2; //错误:普通引用绑定对象必须严格类型匹配

补充:为什么普通引用不能绑定与它类型不一致的对象? 因为需要绑定对象的类型为了与普通引用的类型一致,会发生类型转换生成一个临时值,这也导致我们的引用绑定在一个临时值上,然而临时对象的生命周期很短,在这个临时值的内存被编译器释放时,这个引用就会无效了,所以编译器就必须规定引用的类型与对象类型一致。

double dval=3.14; //注意这里的ri绑定并不是dval对象,而是绑定是一个类型为int的临时值3,所以const引用的好处就是避免通过引用去修改这个临时值,因为临时值得内存已被方式,修改它的值是非法的。 const int& r1=dval;

6)我们可以将基类引用绑定到派生类对象上(基类指针也可以指向派生类对象)。

class Base { public: Base(){cout<<"Base construct..."<<endl;} ~Base(){cout<<"Base delete..."<<endl;system("pause");} }; class Derive:public Base { public: Derive(){cout<<"Derive construct..."<<endl;} ~Derive(){cout<<"Derive delete..."<<endl;system("pause");} }; int main() { Derive d; Base& b=d;//基类引用绑定到派生类对象上:构造顺序为先base,后derive;析构顺序为先derive,后base system("pause"); }

7)引用的本质上是一个常量指针,也就是说在C++编译器的编译过程中用常量指针作为引用的内部实现,因此引用所占用的空间大小于指针相同(32位程序中指针的字节数为4个字节,64位程序中指针的字节数为8个字节)。但是从使用的角度,引用只是一个别名,C++为了使用性而隐藏了引用的存储空间这一细节,也就是我们在打印引用的字节数时,打印并不是指针的字节数,而是引用类型的字节数。


8)引用形参:对于大的类类型对象或者容器对象(string)比较低效,甚至有些类类型(IO类型)根本就不支持拷贝操作,我们可以通过使用引用来访问这些类的对象,同时使用引用形参避免拷贝也会节约时间。对于不需要修改的对象,我们需要使用常量引用作为函数的形参。

bool compare(const string& a,const string& b) { return a>b; }

9)引用与指针相比的好处:

功能性:可以满足多数需要使用指针的场合 安全性:可以避开由于指针操作不当带来的内存错误 操作性:简单易用,又不失功能强大

最新回复(0)