C++中为什么推荐使用引用传参而不推荐使用指针传参

明确传参的目的:

  1. 改变实参的值

  2. 只用一下实参的值

对于目的1分别用指针引用写如下:

指针实现:

//头文件
#ifndef CHAPTER1_H
#define CHATER1_H
#include<string>
#include<iostream>
using namespace std;
struct Stu
{
public:
    Stu(string _name, int _num):name(_name),num(_num) {};
    void cot() { cout << name << ' ' << num; };
private:
    string name;
    int num;
};
void reset(Stu*a);//使用指针传递置0
#endif
--------------------------------------------
//a.cpp
#include"Chapter1.h"
​
int main() {
    Stu* a = new Stu("小红", 300);
    reset(a);
    a->cot();
    return 0;
}
void reset(Stu* a) {
    Stu* temp = new Stu("小明", 200);
    a = temp;
}

并没有改变对象a的值。

 

正确写法:

#include"Chapter1.h"
​
int main() {
    Stu* a = new Stu("小红", 300);
    reset(a);
    a->cot();
    return 0;
}
void reset(Stu* a) {
    Stu* temp = new Stu("小明", 200);
    *a = *temp;
}

 或者让reset称为Stu的friend函数,使其可以对name 和 num直接访问修改。

#ifndef CHAPTER1_H
#define CHATER1_H
#include<string>
#include<iostream>
using namespace std;
struct Stu
{
public:
    Stu(string _name, int _num):name(_name),num(_num) {};
    void cot() { cout << name << ' ' << num; };
    friend void reset(Stu* a);//使用指针传递置0
private:
    string name;
    int num;
};
​
#endif
---------------------------------------
//a.cpp
#include"Chapter1.h"
​
int main() {
    Stu* a = new Stu("小红", 300);
    reset(a);
    a->cot();
    return 0;
}
void reset(Stu* a) {//友元函数实现访问
    /*Stu* temp = new Stu("小明", 200);
    *a = *temp;*/
    a->name = "小明";
    a->num = 200;
}

引用实现:

//头文件
#ifndef CHAPTER1_H
#define CHATER1_H
#include<string>
#include<iostream>
using namespace std;
struct Stu
{
public:
    Stu(string _name, int _num):name(_name),num(_num) {};
    void cot() { cout << name << ' ' << num; };
    friend void reset(Stu& a);//使用引用传递
private:
    string name;
    int num;
};
​
#endif
----------------------------------
   // a.cpp
   #include"Chapter1.h"
​
int main() {
    Stu a = Stu("小红", 300);//栈内初始化
    reset(a);
    a.cot();
    return 0;
}
void reset(Stu& a) {
    a.name = "小明";
    a.num = 200;
}

对于目的2:如果是,只想使用实参的值,禁止函数改变实参的值,那么应该使用const 引用,或者const 指针 const int *p,指针所指的东西是常量这种的。

总结:

  1. 对于要改变传入参数值的情况,推荐使用引用传参,代码比较简单不需要解引用,避免出现错误。

  2. 函数不能改变的形参,使用常量引用,避免给使用者误解,这个形参是可以改变的。

不要返回局部对象的引用或者指针

因为函数作用完成后,局部变量会自动销毁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值