C++对象参数传递的三种方式是什么?值传递指针传递引用传递详解

 更新时间:2026年08月31日 09:48:55   作者:kkk_皮蛋  
还在纠结C++中对象参数怎么传?本文用通俗易懂的例子讲清值传递、指针传递和引用传递的区别,告诉你为什么引用传递最常用、效率最高,以及什么时候该加const,看完就能上手

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

对象作为函数参数

把实参对象的值复制给形参对象,这种传递是单向的,只从实参到形参。因此,函数对形参值做的改变不会影响到实参。

例如: 对象作为函数参数应用。

#include <iostream>
using namespace std;

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

void Square::show() //输出面积
{
    cout << "正方形面积:" << length * length << endl;
}

void Add(Square s)//只是修改形参的值,对实参没有影响
{
    double len = s.get() + 1; //len=原边长+1;
    s.set(len);//修改s的边长
}
int main()
{
    Square s(2);
    cout << "边长增加前:" << endl;
    s.show();
    Add(s);
    cout << "边长增加后:" << endl;
    s.show();
    return 0;
}

对象指针作为函数参数

对象指针作为参数传递的是实参对象的地址。即实参对象指针和形参对象指针指向同一内存地址,因此若形参对象所指向成员数据的改变是可以影响实参数据成员的。

例如:修改上面的代码,验证对象指针作为函数参数可以修改实参的值

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

void Square::show() //输出面积
{
    cout << "正方形面积:" << length * length << endl;
}

void Add(Square *ps)//传递的是指针,形参可以修改实参的值
{
    double len = ps->get() + 1; //len=原边长+1;
    ps->set(len);//修改ps指向的边长
}
int main()
{
    Square s(2);
    cout << "边长增加前:" << endl;
    s.show();
    Add(&s);
    cout << "边长增加后:" << endl;
    s.show();
    return 0;
}

对象引用作为函数参数

使用对象引用作为函数参数最常见,它不但有指针作为参数的优点,而且比指针作为参数更简单、更方便。

引用方式进行参数传递,形参对象就是实参对象的“别名”,对形参的操作其实就是对实参的操作。

例如:用对象引用进行参数传递。

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

void Square::show() //输出面积
{
    cout << "正方形面积:" << length * length << endl;
}

void Add(Square &s)//形参是引用,可以改变实参的值
{
    double len = s.get() + 1; //len=原边长+1;
    s.set(len);//修改ps指向的边长
}
int main()
{
    Square squ(2);
    cout << "边长增加前:" << endl;
    squ.show();
    Add(squ);
    cout << "边长增加后:" << endl;
    squ.show();
    return 0;
}

三种传递方式比较

(1)值传递是单向的,形参的改变并不会引起实参的改变。而指针和引用传递是双向的,可以将改变由形参“传给”实参。

(2)引用是C++中的重要概念,引用的主要功能是传递函数的参数和返回值。学完这3种传递方式后大家会发现“引用传递”的性质像“指针传递”,而书写方式像“值传递”。

(3)指针能够毫无约束地操作内存中的任何东西。指针虽然功能强大,但是用起来比较困难,所以如果的确只需要借用一下某个对象的“别名”,建议使用“引用”,而不要用“指针”。

(4)使用引用作为函数参数与使用指针作为函数参数相比,前者更容易使用、更清晰。

例如:3种传递方式对比

//值传递
void increase1(int n)
{
    cout << "值传递," << &n << endl;
    n++;//修改形参的值
}
//引用传递
void increase(int& n)
{
    cout << "引用传递," << &n <<endl;
    n++;
}
//指针传递
void increase(int* n)
{
    cout << "指针传递," << &*n<<endl;
    *n = *n + 1;
}
int main()
{
    int n = 10;
    cout << "&n=" << &n<<",n="<<n<<endl;
    increase1(n);
    cout <<  "值传递,新n=" << n<<endl;
    increase(n);
    cout <<  "引用传递,新n=" << n<<endl;
    increase(&n);
    cout <<  "指针传递,新n=" << n << endl;
    return 0;
}

说明:

从代码效率上看,用对象值传递的方式的效率相对低一些,它需要创建新的对象来接收实参传来的值,用指针或者引用效率更高。

引用比指针使用起来更加简洁,方便,在C++中更常用。当然如果实参数据不能被修改,可以(应该)在前面加上const。

总结

在C++中引用传递是使用的最多的方式,如果数据不能修改请在参数前加const

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

相关文章

  • C++17新特性编译期 if 语句 (if constexpr)详解

    C++17新特性编译期 if 语句 (if constexpr)详解

    本文介绍了C++17引入的ifconstexpr关键字,通过解析其工作原理、底层机制和应用场景,说明了其在模板元编程中的优势,本文将详细、严谨地剖析其工作原理及核心应用场景,感兴趣的朋友一起看看吧
    2026-04-04
  • vscode+leetcode环境配置方法

    vscode+leetcode环境配置方法

    这篇文章主要介绍了vscode+leetcode环境配置,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 从使用角度解读c++20 协程示例

    从使用角度解读c++20 协程示例

    类比线程,线程是个函数,把这个函数交给 创建线程的api,然后这个函数就变成线程了,这个函数本身没有任何特殊的地方,就是普通函数,这篇文章主要介绍了从使用角度解读c++20 协程示例,需要的朋友可以参考下
    2023-01-01
  • 简单讲解C++的内部和外部函数以及宏的定义

    简单讲解C++的内部和外部函数以及宏的定义

    这篇文章主要介绍了简单讲解C++的内部和外部函数以及宏的定义,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • Win10+VS2017新CUDA项目配置教程

    Win10+VS2017新CUDA项目配置教程

    这篇文章主要为大家详细介绍了Win10+VS2017新CUDA项目配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C语言 文件的随机读写详解及示例代码

    C语言 文件的随机读写详解及示例代码

    本文主要介绍C语言 文件的随机读写,这里整理了相关资料及示例代码以便大家学习参考,学习此部分内容的朋友可以参考下
    2016-08-08
  • C++如何判断一个数字是否为质数

    C++如何判断一个数字是否为质数

    这篇文章主要为大家详细介绍了C++如何判断一个数字是否为质数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 使用 Visual Studio 2022 开发 Linux C++ 应用程序的过程详解

    使用 Visual Studio 2022 开发 Linux C++ 应用程序的过程详解

    Visual Studio 2022 引入了用于 Linux C++ 开发的本机 WSL2 工具集,可以构建和调试 Linux C++ 代码,并提供了非常好的 Linux 文件系统性能、GUI 支持和完整的系统调用兼容性,这篇文章主要介绍了使用Visual Studio 2022 开发 Linux C++ 应用程序,需要的朋友可以参考下
    2021-11-11
  • getdate()函数的用法实例

    getdate()函数的用法实例

    getdate()函数的用法实例,需要的朋友可以参考一下
    2013-03-03
  • C语言中字符串的存储方法

    C语言中字符串的存储方法

    这篇文章主要为大家详细介绍了C语言中字符串的存储方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论