#include <iostream.h>
class human
{
public:
human(){ human_num++;};
static int human_num;
~human()
{
human_num--;
print();
}
void print()
{
cout<<"human num is: "<<human_num<<endl;
}
protected:
private:
};
int human::human_num = 0;
human f1(human x)
{
x.print();
return x;
}
int main(int argc, char* argv[])
{
human h1;
h1.print();
human h2 = f1(h1);//调用拷贝构造函数
h2.print();
return 0;
}
输出:
1
1
0
0
-1
-2
调用拷贝构造函数的时机:
1) 一个对象以值传递的方式传入函数体。
2) 一个对象以值传递的方式从函数返回。
3) 一个对象需要通过另外一个对象进行初始化。
class stu
{
int a;
public:
stu(int x=0){a=x;cout<<"stu的普通构造函数/n";}
stu(const stu &ob){a=ob.a;cout<<"stu的拷贝构造函数调用/n";}
void operator = (stu ob){a=ob.a;cout<<"=运算符重载函数被调用/n";}
~stu(){}
};
class atm
{
stu p;
int b;
public:
atm(stu m,int n){p=m;b=n;}
~atm(){}
};
void main()
{
stu stu1(100);
atm ob(stu1,200);
}
这个题目看来,如果一个函数的参数是按值传递的,那么就一定会调用拷贝构造函数,包括构造函数如果也是按值传递,也会调用拷贝构造函数。
你这里的构造函数
atm(stu m,int n){p=m;b=n;} 和 重载函数
void operator = (stu ob){a=ob.a;cout<<"=运算符重载函数被调用/n";}
都是按值传递的,所以会调用两次拷贝构造函数,
我在vc下面测试得出得结论。