拷贝构造函数的歪解

mac2026-01-08  7

给出一个大家都很熟悉的一段对调两个整数的代码:

#include <iostream> using namespace std; int main() { int a = 3, b = 4; int t; t = a; a = b; b = t; cout << a << "," << b << endl; cout << endl; return 0; }

其中的这个t,其实就是我让编译器申请了一块临时内存,用于对调a, b

下面来一段简单的类,来说明拷贝构造函数: 类声明:

#include <iostream> using namespace std; class Student {//Student类 int m_num;//学号 int m_age;//年龄 public: Student();//构造函数 ~Student();//析构函数 Student(const Student& S){//拷贝构造函数 m_age = S.m_age; m_num = S.m_num; } void ShowInfo()://展示对象信息函数 int Getnum(){ return m_num; } void Setnum(int val){ m_num = val; } int Getage(){ return m_age; } void Setage(int val){ m_age = val; } };

类的成员函数实现我就不写了 哈哈哈 ~~ 主函数:

int main() { Student.S1 = (2, 3);//学生S1 Student.S2 = S1;//学生S2拷贝了学生S1的数据 S1.ShowInfo(); S2.ShowInfo(); cout << endl; return 0; }

事实上,S2拷贝S1的信息,先运行至拷贝构造函数,编译器在进行一一进行拷贝构造。 重点:这个拷贝构造函数其实就可以理解成上边的 t,挺像的,对我我们人类是没用的,但是对于计算机来说有用,都是申请一块临时内存!

其实最理想的例子在下面: 哈哈(我的朱同学给我讲的)

int main() { int x, y; x = 3; y = 4; cout << x << "," << y << endl; swap(x, y); cout << x << "," << y << endl; cout << endl; return 0; } void swap(int& a, int& b){ int t; t = a; a = b; b = t; }

这就是传值! 假如传入的不是引用&,x, y拿出一个副本,给swap()的a, b,在swap()中确实对调了两个值,但是在main()中,并没有实现x, y的对调。 加上引用&之后,&x->a,&y->b,此时传入的是x, y的内存地址,在swap()中对调的是两个内存地址,所以才能真正的实现这个swap()功能。

最新回复(0)