打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【博文连载】C 中的“引用”

引用就是别名,如下,rnum是num的别人,对rnum的操作实际就是对num的操作。这里的&是引用运算符,不是取址运算符。

int num = 1;int &rnum=num;

还可以定义一个对象的别名,如下,注意不能定义一个类的别名,因为它没有具体的内存地址。

Human Mike;Human &rMike=Mike;

还要注意一点是,定义引用时一定要同时对该引用进行初始化。

函数的参数传递有三种方式:

(1)通过值来传递函数参数

当通过值的方式给函数传递参数时,编译器会自动在栈中创建该参数的拷贝,因此,函数处理的是这些副本,一旦函数执行完毕,副本就被释放,原来的参数未被修改。

void swap(int a,int b); // 声明swap(a,b); // 调用

(2)通过指针来传递函数参数

当通过指针的方式给函数传递参数时,实际上传递的是参数的内存地址,而无需在栈中创建参数的拷贝,因此是对参数自身的参数。

void swap(int *a,int *b); // 声明swap(&a,&b); // 调用

(3)通过引用来传递函数参数

对比于指针的间接访问,采用引用的方式可以直接访问内存地址。另外,使用别名的方式传递参数比用指针传递更加方便和清晰,并且具有指针的功能。

void swap(int &ra,int &rb); // 声明swap(a,b); // 调用

传递对象的方式有四种:

(1)用值来传递对象

假如仅仅是传递变量的话,采用指针或引用这种按址传递方式的优势不是很明显,但假如是传递较大的对象的话,则优势比较明显。这是因为按值方式向函数传递一个对象时,会建立该对象的拷贝,而从函数返回一个对象时也要建立被返回对象的拷贝。测试代码如下:

#includeusing namespace std;class A{public: A(); A(A&); ~A();};A::A(){ cout < '执行构造函数创建一个对象n';}a::a(a&){="" cout="">< '执行复制构造函数创建该对象的副本n';}a::~a(){="" cout="">< '执行析构函数删除该对象n';}a="" func(a="" one);int="" main(){="" a="" a;="" func(a);="" system('pause');="" return="" 0;}a="" func(a="" one){="" return="">

输出结果:

执行构造函数创建一个对象执行复制构造函数创建该对象的副本执行复制构造函数创建该对象的副本执行析构函数删除该对象执行析构函数删除该对象执行析构函数删除该对象

(2)用指针来传递对象

测试代码如下:

#includeusing namespace std;class A{public: A(); A(A&); ~A();};A::A(){ cout < '执行构造函数创建一个对象n';}a::a(a&){="" cout="">< '执行复制构造函数创建该对象的副本n';}a::~a(){="" cout="">< '执行析构函数删除该对象n';}a="" *func(a="" *one);int="" main(){="" a="" a;="" func(&a);="" system('pause');="" return="" 0;}a="" *func(a="" *one){="" return="">

输出结果:

执行构造函数创建一个对象

(3)用const指针来传递对象

采用指针来传递对象,虽然可以避免调用复制构造函数和析构函数,但由于它得到了该对象的内存地址,可以随时修改对象的数据,因此它破坏了按值传递的保护机制。如果用const指针来传递对象,就可以防止任何试图对该对象所进行的操作行为,并且保证返回一个不被修改的对象。测试代码如下:

#includeusing namespace std;class A{public: A(); A(A&); ~A(); int get()const{return x;} void set(int i){x=i;}private: int x;};A::A(){ cout < '执行构造函数创建一个对象n';}a::a(a&){="" cout="">< '执行复制构造函数创建该对象的副本n';}a::~a(){="" cout="">< '执行析构函数删除该对象n';}const="" a="" *const="" func(const="" a="" *const="" one);int="" main(){="" a="" a;="" a.set(99);="" func(&a);="" system('pause');="" return="" 0;}const="" a="" *const="" func(const="" a="" *const="" one){="" cout="">< one-="">get() < endl;="" return="">

输出结果:

执行构造函数创建一个对象99

(4)用引用来传递对象

由于引用不能重新分配去引用另一个对象,它始终是常量。测试代码如下:

#includeusing namespace std;class A{public: A(); A(A&); ~A(); int get()const{return x;} void set(int i){x=i;}private: int x;};A::A(){ cout < '执行构造函数创建一个对象n';}a::a(a&){="" cout="">< '执行复制构造函数创建该对象的副本n';}a::~a(){="" cout="">< '执行析构函数删除该对象n';}a="" &func(a="" &one);int="" main(){="" a="" a;="" a.set(99);="" func(a);="" system('pause');="" return="" 0;}a="" &func(a="" &one){="" cout="">< one.get()="">< endl;="" return="">

输出结果:

执行构造函数创建一个对象99

引用不但实现了指针的功能,而且使用起来更加方便,那为什么还要指针?因为指针可以为空,但引用不能为空,指针可以被赋值,引用只可以被初始化,不可以被赋为另一个对象的别名。如果想使一个变量记录不同对象的地址,就必须使用指针。要明白的一点是不可以直接用引用来指向堆中新建的空间,引用只是个别名,不可以作为指针来使用。如int &r=new int;是错误的。

招聘信息

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++引用
智能指针shared
c++形参实参
面试中常见的C语言与C++区别的问题
C/C++:函数参数传递方式
值传递、指针传递、引用传递的区别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服