首页 > 编程语言 >C++ 何时需要使用 引用 & ?

C++ 何时需要使用 引用 & ?

时间:2022-11-08 15:46:03浏览次数:40  
标签:const 函数 对象 何时 C++ 传递 引用 指针

原因:  

  在C++中, 由于以下原因, 变量通过引用传递:

1)要修改调用者函数的局部变量:引用(或指针)允许被调用函数修改调用者函数的局部变量。例如, 考虑以下示例程序, 其中fun()能够修改局部变量Xof主要().

2)对于传递大型参数:如果实参很大,通过引用(或指针)传递更有效,因为实际上只传递一个地址,而不是整个对象。这一点仅对结构和类变量有效, 因此我们对int, char等基本类型没有任何效率优势。

3)为了避免对象切片:如果将子类对象传递给期望超类对象的函数,则按值传递的对象将被切片。

4)在函数中实现运行时多态。我们可以通过将对象作为参考(或指针)传递给它来使函数变为多态。

 

建议:

建议的做法是:仅由于原因2、3而选择通过引用传递引用参数时, 使引用参数为const。建议这样做以避免对对象进行意外修改。

对于使用传递值而不做修改的函数:

  1. 如果数据对象较小,如内置数据类型或者小型结构,则按值传递。
  2. 如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向 const 的指针。
  3. 如果数据对象是较大的结构,则使用 const 指针或 const 引用,以提高运行效率。这样可以节省复制结构所需的时间和空间。
  4. 如果数据对象是类对象,则使用 const 引用。类设计的语义常常要求使用引用,这是 C++ 增加引用特性的主要原因。因此,传递类对象参数的标准方式是按引用传递。

对于修改调用函数中数据的函数:

  1. 如果数据对象是内置数据类型,则是用指针。如果看到诸如 fixit(&x) 这样的代码(其中 x 是 int 型),则很明显,该函数将修改 x。
  2. 如果数据对象是数组,则只能使用指针。
  3. 如果数据对象是结构,则使用引用或指针。
  4. 如果数据对象是类对象,则使用引用。

标签:const,函数,对象,何时,C++,传递,引用,指针
From: https://www.cnblogs.com/slowlydance2me/p/16869884.html

相关文章

  • C++ 关于size()和sizeof()的区别
    sizeof(a)返回的是对象占用内存的字节数,而a.size()是string类定义的一个返回字符串大小的函数,两个是完全不一样的概念。明确两者的概念和作用:1、size()函数:c++中,在获取字......
  • 《数据结构与算法分析(C++语言描述)》
    在看这本书总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。书籍:《数据结构与算法分析(C++语言描述)》作者:LarryNyhoff著、黄达明等译源代......
  • C++学习
     平时有时间也可以刷一刷​​leetcode​​​,​​hihocoder​​,很多题目思考起来还是很有意思的。对于其他的课本,我觉得《算法导论》《编程珠玑》《编程之美》都是不错的经......
  • C/C++ 编程
    写一个函数找出一个整数数组中,第二大的数 constintMINNUMBER=-32767;intfind_sec_max(intdata[],intcount){intmaxnumber=data[0];i......
  • Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持
    Xmake是一个基于Lua的轻量级跨平台构建工具。它非常的轻量,没有任何依赖,因为它内置了Lua运行时。它使用xmake.lua维护项目构建,相比makefile/CMakeLists.txt,配置语......
  • pip error: Microsoft Visual C++ 14.0 or greater is required
    https://zhuanlan.zhihu.com/p/471661231去官网下载cpp编译工具:https://my.visualstudio.com/Downloads/Featured?mkt=zh-cn下载后直接安装默认值比起有的教程安装......
  • C++ 不知图系列之基于邻接矩阵实现广度、深度搜索
    1.前言图是一种抽象数据结构,本质和树结构是一样的。图与树相比较,图具有封闭性,可以把树结构看成是图结构的基础部件。在树结构中,如果把兄弟节点之间或子节点之间横向连接,......
  • 二叉搜索树 - C++ 实现
    二叉搜索树-C++实现......
  • VC++_读取SHELL命令结果
    voidCFfmpeg_divide_videoDlg::OnButtonBeginDivide(){SECURITY_ATTRIBUTESsa;HANDLEhRead,hWrite;sa.nLength=sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDe......
  • VC++_文件选择器
    CStringstrFile=_T("");CFileDialogdlgFile(TRUE,NULL,NULL,OFN_HIDEREADONLY,_T("DescribeFiles(*.apk)|*.apk|AllFiles(*.*)|*.*||"),NULL);if......