0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++中的“引用”

SwM2_ChinaAET 来源:未知 作者:李倩 2018-09-23 09:50 次阅读

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

intnum=1; int&rnum=num;

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

HumanMike; Human&rMike=Mike;

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

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

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

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

voidswap(inta,intb);//声明 swap(a,b);//调用

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

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

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

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

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

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

传递对象的方式有四种:

(1)用值来传递对象

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

#include usingnamespacestd; classA { 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 one; }

输出结果:

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

(2)用指针来传递对象

测试代码如下:

#include usingnamespacestd; classA { 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 one; }

输出结果:

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

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

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

#include usingnamespacestd; classA { public: A(); A(A&); ~A(); intget()const{returnx;} voidset(inti){x=i;} private: intx; }; 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 one; }

输出结果:

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

(4)用引用来传递对象

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

#include usingnamespacestd; classA { public: A(); A(A&); ~A(); intget()const{returnx;} voidset(inti){x=i;} private: intx; }; 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 one; }

输出结果:

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3864

    浏览量

    61307
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72899

原文标题:【博文连载】C++中的“引用”

文章出处:【微信号:ChinaAET,微信公众号:电子技术应用ChinaAET】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在MDK中使用C++,整理的经验

    一:C++引用C文件注意:C++文件能引用C文件,但是C
    发表于 03-10 15:32

    CC++const的用法比较

    为0)。针对Cconst的上述局限性,C++作出了重大的改进。在C++,可以使用const来定义常数,因为const在编译器的控制范畴内
    发表于 11-11 10:00

    请问在C/C++环境能直接使用DSP寄存器吗

    请教:在C/C++ 环境,通过extern __cregister volatile unsigned int AMR;说明后,就可以在 C 代码
    发表于 01-24 11:03

    如何在C++包含C代码?

    :32: 未定义对“CB_Display_GetValues”的引用你有这个问题的解决方案或者你知道如何解决吗?在 C 包含 C++ 代码如何工作(相反的方式)?非常感谢,节日快乐,
    发表于 01-11 06:42

    IDF.PY编译时提示找不到iostream的原因?怎么才能正常引用iostream这些c++的标准库啊?

    failed with exit code 1我在工程里引用了一个C++的库,里面用了iostream, 在一个C++的.h头文件开头。c++类库我确认都在idf的对应目录下,包括i
    发表于 02-16 06:58

    请问ESP32+Eclipse如何添加C++生成得静态库(.a)如何引用

    ESP32在Eclipse下如何添加C++生成得静态库(.a)如何引用
    发表于 02-20 08:33

    C++:指针和引用的区别与联系

    指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元。引用引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。
    的头像 发表于 06-29 15:05 5053次阅读
    <b class='flag-5'>C++</b>:指针和<b class='flag-5'>引用</b>的区别与联系

    C++:常引用的概念和作用

    int &a=b 相当于 int const a=b。即引用是一个指针常量(又称常指针,即一个常量,其类型是指针)。 每当编译器遇到引用变量a,就会自动执行 操作。
    的头像 发表于 06-29 15:08 1.2w次阅读
    <b class='flag-5'>C++</b>:常<b class='flag-5'>引用</b>的概念和作用

    C++引用的使用场景

    C++引用的使用场景
    的头像 发表于 06-29 15:18 3828次阅读
    <b class='flag-5'>C++</b>:<b class='flag-5'>引用</b>的使用场景

    C++中的const和引用的讨论

    今天给大家分享一下这段时间学习c++的总结学习:c++里面的const关键字和引用
    的头像 发表于 12-24 15:35 630次阅读

    C语言代码中的extern

    C++程序引用过的话。 这与C++有什么关系呢? 看看__cplusplus(注意前面是两个下划线) 的名字你就应该知道它与C++有很大关系。__cplusplus是一个
    的头像 发表于 09-02 15:13 2253次阅读
    C语言代码中的extern

    C++基础语法中的引用、封装和多态

    本期是C++基础语法分享的第六节,今天给大家来分享一下: (1)引用; (2)宏; (3)成员初始化列表; (4)封装; (5)继承; (6)多态; 引用 左值引用 常规
    的头像 发表于 09-12 09:58 1148次阅读

    C语言中的extern

    被任何C++程序引用过的话。     这与C++有什么关系呢? 看看__cplusplus(注意前面是两个下划线) 的名字你就应该知道它与C++有很大关系。__cplusplus是一个
    的头像 发表于 11-02 14:35 2261次阅读
    C语言中的extern

    如何用cplusplus来识别C和C++编译器

    C++程序引用过的话。 这与C++有什么关系呢? 看看__cplusplus(注意前面是两个下划线) 的名字你就应该知道它与C++有很大关系。__cplusplus是一个
    的头像 发表于 07-06 14:13 1508次阅读

    C++引用和指针

    之前的文章我们已经介绍了C++中的基本类型如int,bool和double等,除了基本类型C++还有一些更复杂的数据类型复合类型,所谓的复合类型就是通过其他类型定义的类型,本篇文章我们将会着重介绍C++的复合类型
    的头像 发表于 03-17 14:00 424次阅读