明确传参的目的:
-
改变实参的值
-
只用一下实参的值
对于目的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,指针所指的东西是常量这种的。
总结:
-
对于要改变传入参数值的情况,推荐使用引用传参,代码比较简单不需要解引用,避免出现错误。
-
函数不能改变的形参,使用常量引用,避免给使用者误解,这个形参是可以改变的。
不要返回局部对象的引用或者指针
因为函数作用完成后,局部变量会自动销毁
本文详细探讨了在C++中如何通过指针和引用来改变实参值,以及如何使用const引用保护实参不被修改。通过实例展示了正确和错误的用法,并强调了使用引用作为参数的简洁性和避免错误的优势。同时提醒开发者,在无法改变参数值的情况下应使用const引用,并避免返回局部对象的引用或指针,以防对象在函数结束后被销毁。
15万+

被折叠的 条评论
为什么被折叠?



