第2个回答 2012-05-29
通过一个程序理解拷贝构造函数
#include"iostream"
using namespace std;
class Student
{ private:
static int number;
public:
Student()
{number++;
show("Student");
}
Student(const Student&)
{ number++;
show("Student");
}
~Student()
{ number--;
show("~Student");
}
static void show(const char *str)
{ if(str)
cout<<str<<":";
cout<<"number="<<number<<endl;
}
};
int Student::number=0;
Student f(Student x)
{ x.show("x inside f()");
return x;
}
int main()
{ Student h1;
Student h2=f(h1);
Student::show("after call f()");
return 0;
}
运行结果
Student:number=1
Student:number=2
x inside f():number=2
Student:number=3
~Student:number=2
after call f():number=2
~Student:number=1
~Student:number=0
Press any key to continue
结果分析:开始定义一个对象 Student h1 调用构造函数使得 number++,使number=1,在调用函数f(h1)使得形参得到实参在函数体内又生成一个对象使得number=2,接着调用x.show()输出x inside f():number=2;当返回 一个对象调用拷贝构造函数初始化h2,使得 number=3,接着对返回对象进行析构,得到~Student:number=2,在运行Student::show("after call f()"),结束时析构两个对象 h1,h2,使得 number=1,0;注意:如果不定义拷贝构造函数系统会有默认的拷贝构造函数