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

    文章

    4327

    浏览量

    62573
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73623

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

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

收藏 人收藏

    评论

    相关推荐

    C++避坑指南

    C++是一门古老的语言,但仍然在不间断更新,不断引用新特性。但与此同时 C++又甩不掉巨大的历史包袱,并且 C++的设计初衷和理念造成了
    发表于 09-15 09:04 565次阅读

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

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

    c引用和指针的区别

    is derived-declarator-type-list cv-qualifier-seq pointer to T。 The cv-qualifiers apply to the pointer and not to the object pointer to. 摘自《ANSI C++ Standard》
    发表于 09-27 15:19 1次下载
    <b class='flag-5'>c</b><b class='flag-5'>引用</b>和指针的区别

    Visual C++教程之C++的语言资料概述免费下载

    本文档详细介绍的是Visual C++教程之C++的语言资料概述免费下载主要内容包括了:1 从CC++的程序结构 ,2 程序书写规范,3 数据类型,4 运算符和表达式,5 基本语句
    发表于 02-15 15:59 3次下载
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的语言资料概述免费下载

    C++引用的使用场景

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

    C++的const和引用的讨论

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

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

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

    适合具备 C 语言基础的 C++ 入门教程(二)

    在上一则教程,通过与 C 语言相比较引出了 C++ 的相关特性,其中就包括函数重载,引用,this 指针,以及在脱离 IDE 编写 C++
    发表于 01-25 19:13 1次下载
    适合具备 <b class='flag-5'>C</b> 语言基础的 <b class='flag-5'>C++</b> 入门教程(二)

    c++引用详细解说1

    C++C语言的继承,它可进行过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
    的头像 发表于 02-15 09:40 578次阅读
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b>详细解说1

    c++引用详细解说2

    C++C语言的继承,它可进行过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
    的头像 发表于 02-15 09:43 499次阅读
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b>详细解说2

    c++引用详细解说3

    C++C语言的继承,它可进行过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
    的头像 发表于 02-15 09:43 533次阅读
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b>详细解说3

    c++引用详细解说4

    C++C语言的继承,它可进行过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
    的头像 发表于 02-15 09:43 514次阅读
    <b class='flag-5'>c++</b><b class='flag-5'>引用</b>详细解说4

    C++引用和指针

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

    C++的const关键字介绍

    前一篇文章我们主要介绍了C++的复合类型引用和指针,这篇文章我们将会主要介绍C++const关键字。有时候我们想定义一个值不能被改变的变
    的头像 发表于 03-17 14:01 659次阅读

    C++ std::tie函数的作用和用法

    C++std::tie函数的作用就是从元素引用中生成一个tuple元组,其在头文件定义
    的头像 发表于 07-18 17:28 844次阅读