类的定义:
class Student{
public:
Student();//无参的通用构造函数
Student(const Student &stu);//拷贝构造函数
~Student();//析构函数
int get_age();//获取年龄
int get_grade();//获取成绩
void set_age(int _age);//设置年龄
void set_grade(int _grade);//设置成绩
private:
int age;
int grade;
};
Student::Student(){
age = 0;
grade = 0;
printf("调用了无参的通用构造函数\n");
}
Student::Student(const Student &stu){
age = stu.age;
grade = stu.grade;
printf("调用了拷贝构造函数\n");
}
Student::~Student(){
age = 0;
grade = 0;
printf("调用了析构函数\n");
}
int Student::get_age(){
return age;
}
int Student::get_grade(){
return grade;
}
void Student::set_age(int _age){
age = _age;
}
void Student::set_grade(int _grade){
grade = _grade;
}
1. 1代码,参数不用引用类型
void fun1(Student stu){
printf("stu的年龄=%d\n",stu.get_age());
printf("stu的成绩=%d\n",stu.get_grade());
}
void test_11_02(){
Student stu1;
fun1(stu1);
}
1.2 执行结果
1.3 分析
可以发现函数fun1(Student stu)采用非引用参数,会调用一次拷贝构造函数。
2.1 代码,采用引用类型参数
void fun2(Student &stu){
printf("stu的年龄=%d\n",stu.get_age());
printf("stu的成绩=%d\n",stu.get_grade());
}
void test_11_03(){
Student stu1;
fun2(stu1);
}
2.2 执行结果
2.3 分析
很明显采用引用类型参数相比采用非引用类型参数,没有调用拷贝构造,所以会节省资源、效率更高。
3.1 代码 ;返回值 为非引用类型
Student fun3(Student &stu){
stu.set_age(18);
stu.set_grade(70);
printf("stu的年龄=%d\n",stu.get_age());
printf("stu的成绩=%d\n",stu.get_grade());
return stu;
}
void test_11_04(){
Student stu1;
fun3(stu1);
}
3.2 执行结果
3.3 分析
发现同样调用了,拷贝构造函数
4.1 代码 ;返回值 为引用类型
Student& fun4(Student &stu){
stu.set_age(19);
stu.set_grade(80);
printf("stu的年龄=%d\n",stu.get_age());
printf("stu的成绩=%d\n",stu.get_grade());
return stu;
}
void test_11_05(){
Student stu1;
fun4(stu1);
}
4.2 执行结果
4.3 分析
可以发现,想比采用 非引用类型返回值,少调用了拷贝构造函数,效率更高,占用资源更少。
参考: 返回引用类型详解