当前位置: 首页 > news >正文

C++中,应尽可能将引用形参声明为const

一、什么时候需要使用引用形参呢?

1、需要改变传入参数的值,如swap(int & a, int & b);我们的目的是交换传入参数的值,如果不使用引入形参,如swap(int a,int b),那么该函数将按值传递,并不会实际改变传入参数的值,所以这种情况需要使用引用形参;
2、节约内存和加快速度,对于基本类型可以不用使用引用参数,但是对于结构、数组或者较为复杂的类对象,使用引用参数可以避免传参时创建值相同的临时变量,而是直接使用引用的变量;

二、为什么应尽可能将引用形参声明为const呢?

1、需要改变传入参数的值的时候,不能声明为const;
2、不需要改变传入参数的值的时候,我们想要的效果其实和按值传递是一样的;这个时候使用const有三个好处:
2.1 使用const可以避免不小心修改传入的引用变量;
2.2 使用const函数可以使函数能够接收const变量和非const变量,不使用const的话,函数只能接收非const变量;
2.3 使用const可以使得引用形参能够接收临时变量(右值)

三、自己遇到的问题:

//Add.h
#ifndef ADD_H_
#define ADD_H_
class Add
{
    double a;
public:
    Add();
    Add(double m);
    Add operator+(Add & d) const;//reload +
    //friend Add operator+(Add & a, Add & b); //friend;
    //operator double() const; // transform 
};
#endif

可以看到这里重载+运算符的函数 Add operator+(Add & d) const; 这里的引用形参并未加const;

//这个是Add类的方法实现;
#include <iostream>
#include "add.h"

Add::Add()
{
    a = 0.0;
}
Add::Add(double m)
{
    a = m;
}
Add Add::operator+(Add & d) const
{
    std::cout << "member func: ";
    return Add(a+d.a);
}
//Add operator+(Add & a, Add & b)
//{
//    std::cout << "friend func: ";
//    return Add(a.a+b.a);
//}
// Add::operator double() const
// {
//     return a;
// }
// 使用测试Add类
#include "add.h"

int main()
{
    using namespace std;
    Add a = 1.0;
    double b = 2.0;
    Add c = 1.0;
    Add total;
    total = a+b; //use member func+
    Add total_2;
    total_2 = a+c;
    return 0;
}

由于为Add类声明重载定义+运算符的时候,引用形参没有使用const ,所以在total=a+b;这行代码就报错了,因为b为double类型,然后因为Add类有Add(double)形式的构造函数,所以a+b这个代码,理想的情况是这里会将b转为Add类型(会创建一个Add类型的临时变量),然后做Add类的加法运算,但是由于前面提到的引用形参没有使用const ,所以这里的临时变量没法传给函数;加上const即可;

http://www.dtcms.com/a/112124.html

相关文章:

  • Smart Link 技术全面解析
  • 使用人工智能大模型腾讯元宝和ttsmp3工具,免费使用文字进行配音
  • Python入门(6):Python序列结构-元组
  • FastAPI-Cache2: 高效Python缓存库
  • Linux系统调用编程
  • 嵌入式开发中栈溢出的处理方法
  • MySQL学习笔记(一)——MySQL下载安装配置
  • 一文全面了解GEO中的知识图谱
  • leetcode数组-长度最小的子数组
  • 【Git】“warning: LF will be replaced by CRLF”的解决办法
  • 【MySQL】DML:添加-修改-删除数据 (数据操作语言) 学习笔记
  • 投影向量的计算公式推导
  • RTOS任务句柄的作用
  • Unity的插件TouchScripts插件的新手入门指南和常用的API使用方法
  • Tradingview 策略分享 - SSL 混合和 CE 交易策略
  • Android Fresco 框架动态图支持模块源码深度剖析(七)
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(3)
  • LabVIEW中VISA Write 与 GPIB Write的差异
  • 【Linux】冯·诺依曼体系结构
  • kotlin中主构造函数是什么
  • Java EE期末总结(第一章)
  • 【图像处理基石】什么是neural style transfer?
  • python基础-09-读写文件
  • tp5 shell_exec() has been disabled for security reasons生成图片报错没权限
  • Android面试总结之算法思想篇
  • Mysql 中的 B+树 和 B 树在进行数据增删改查后的结构调整过程是怎样的?
  • MaxEnt模型全解析:从原理到 R 语言实战,开启生态环境研究新视野
  • 验证码实现
  • d202541
  • 量子计算入门:Qiskit实战量子门电路设计