明确传参的目的:
-
改变实参的值
-
只用一下实参的值
对于目的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,指针所指的东西是常量这种的。
总结:
-
对于要改变传入参数值的情况,推荐使用引用传参,代码比较简单不需要解引用,避免出现错误。
-
函数不能改变的形参,使用常量引用,避免给使用者误解,这个形参是可以改变的。
不要返回局部对象的引用或者指针
因为函数作用完成后,局部变量会自动销毁