当前位置: 代码网 > it编程>编程语言>C/C++ > C++对象参数传递的三种方式是什么?值传递指针传递引用传递详解

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

2026年08月31日 C/C++ 我要评论
c++语言中,对象作为函数的参数和返回值的传递方式有 3 种:值传递、指针传递和引用传递对象作为函数参数把实参对象的值复制给形参对象,这种传递是单向的,只从实参到形参。因此,函数对形参值做的改变不会影

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com