C++函数参数用值传递还是引用传递好 区别是什么

 更新时间:2026年08月31日 09:52:51   作者:凉夏465  
还在纠结C++函数参数用值传递、指针传递还是引用传递?本文用代码对比三种方式的传递方向、效率和改变实参的能力,帮你快速搞懂区别,选对最合适的传参方式,提升程序性能

C++对象作为函数的参数和返回值的传递方式有 3 种:传递值,传指针,传引用

参数传递过程:

  • 实参:拥有值,传递给函数(给)
  • 形参:定义值,被传递(拿)

对象作为函数参数

实参对象的值赋值形参对象,而形参对象的生命周期结束后,值消失,实参对象的传递只供函数使用,函数对形参的改变不会影响到实参,所以称这种传递是单项的

对象指针作为函数参数

对象指针作为参数传递的是实参对象的地址,形参、实参指针指向同一地址,(而在c语言中我们知道,需要通过函数传参改变值需要传指针解引用),

C++同样包含这一性质,只要将形参解引用改变数值,即同样影响实参,双向传递;

对象引用作为函数参数

函数参数最常见的方式:

传引用(包含指针的优点,且简化指针的解引用操作),对象引用即给实参取别名作为形参,二者本质是同一参数,对形参的操作无差别操作在实参上,所以是双向的。

引用的性质像指针,书写方式像值。

三种方式的类比

指针

引用

传递方向:

单项传递

双向传递

双向传递

传递实质:

对象值的复制

对象地址

对象本身

改变实参的方式:

无法改写实参

解引用

改写引用=改写实参

三种方式代码比较及输出对比

class Square //正方形
{
public:
    Square(double len=0) :length(len) //构造函数
    {}
    void set(const double len) //修改边长
    {
        length = len;
    }
    int get()//获取边长的值
    {
        return length ;
    }
    void show() //输出
    {
        cout << "面积为:" << length * length<<"   边长为:" <<length<< endl;
    }
private:
    double length;//边长
};

函数:

//值
void Add(Square b)
{
    int c = b.get();
    b.set(c+1);
    cout << "修改后"<<endl;
    b.show();
    cout << " 对象 值传递函数完毕" << endl;
}
//指针
void Add2(Square* b)
{
    int c = b->get();
    b->set(c + 2);
    cout << "修改后" << endl;
    b->show();
    cout << " 指针 传递函数完毕" << endl;
}
//引用
void Add3(Square& b)
{
    int c = b.get();
    b.set(c + 3);
    cout << "修改后" << endl;
    b.show();
    cout << " 引用 传递函数完毕" << endl;
}
int main()
{
    Square a;
    a.show();
    cout << endl;
    //主函数分别调用以下三个函数:
    Add(a);//值传递
    Add2(&a);//指针传递
    Add3(a);//引用传递
    cout <<endl<< "主函数:" << endl;
    a.show();
}

输出结果

总结

  • 值传递:对象通常占用内存较大,值传递需创建相同的对象并复制实参对象的数据到形参对象中,传递效率低,且不能改变实参数据,容易产生错误。
  • 指针传递:功能强大并且可以改变实参数据,但是相比引用,指针保存地址需要解引用等转换操作较为繁琐
  • 引用传递:性质像“指针传递”,而书写方式像“值传递”,可以改变实参数据,是最普遍的传参方式!!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详谈C++何时需要定义赋值/复制构造函数

    详谈C++何时需要定义赋值/复制构造函数

    下面小编就为大家带来一篇详谈C++何时需要定义赋值/复制构造函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C++中使用function和bind绑定类成员函数的方法详解

    C++中使用function和bind绑定类成员函数的方法详解

    这篇文章主要介绍了C++中使用function和bind绑定类成员函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Qt实现简单折线图表

    Qt实现简单折线图表

    这篇文章主要为大家详细介绍了Qt实现简单折线图表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++智能指针模板应用详细介绍

    C++智能指针模板应用详细介绍

    从比较简单的层面来看,智能指针是RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制对普通指针进行的一层封装。这样使得智能指针的行为动作像一个指针,本质上却是一个对象,这样可以方便管理一个对象的生命周期
    2022-08-08
  • 关于C语言操作符的那些事(超级全)

    关于C语言操作符的那些事(超级全)

    这篇文章主要给大家介绍了关于C语言操作符的那些事儿,c语言的操作符有很多,包括算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用、函数调用和结构成员,需要的朋友可以参考下
    2021-08-08
  • C语言函数栈帧的创建与销毁原理图解

    C语言函数栈帧的创建与销毁原理图解

    我们知道c语言中函数都是被调用的,main函数里面能调用其他函数,其实main函数也是被别的函数调用的,下面通过本文给大家分享c语言函数栈帧的创建和销毁过程,一起看看吧
    2022-05-05
  • C++实现判断字符串是否回文实例解析

    C++实现判断字符串是否回文实例解析

    这篇文章主要介绍了C++实现判断字符串是否回文,其中采用了数据结构中栈以及过滤字符等技术,,需要的朋友可以参考下
    2014-07-07
  • Objective-C的内省(Introspection)用法小结

    Objective-C的内省(Introspection)用法小结

    这篇文章主要介绍了Objective-C的内省(Introspection)用法,这是面向对象语言和环境的一个强大特性,需要的朋友可以参考下
    2014-07-07
  • C++深入探究类与对象之友元与运算符重载

    C++深入探究类与对象之友元与运算符重载

    友元就是让一个函数或者类,访问另一个类中的私有成员;打个比方,这相当于是说:朋友是值得信任的,所以可以对他们公开一些自己的隐私,运算符重载的实质就是函数重载或函数多态,运算符重载是一种形式的C++多态,目的在于让人能够用同名的函数来完成不同的基本操作
    2022-04-04
  • c++11多线程编程之std::async的介绍与实例

    c++11多线程编程之std::async的介绍与实例

    这篇文章主要给大家介绍了关于c++11多线程编程之std::async的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论