浙大 C++
拷贝函数
static int countObject = 0;
class A
{
public:
A():i(100){countObject++;cout << "A() count=" << countObject << endl;};
~A(){countObject--;cout << "~A() count=" << countObject << endl;};
private:
int i;
};
A f(A a){
cout << "f()" << endl;
return a;
}
int main()
{
A a;
// A b = a;
A c = f(a);
cout << "main over" << endl;
}
/**
* 运行结果:
A() count=1
f()
~A() count=0
main over
~A() count=-1
~A() count=-2
*/
添加拷贝函数
A(const A& a){countObject++;cout << "copy A() count=" << countObject << endl;};
/**
A() count=1
copy A() count=2
f()
copy A() count=3
~A() count=2
main over
~A() count=1
~A() count=0
*/
拷贝函数2
When are copy ctors called?
int x(100); // 与 int x = 100; 等价
cout << x << endl;
// baby_b = baby_a 其实和 baby_b(baby_a) 也是等价的
// 都是拷贝构造
optimize out
static int countObject = 0;
class A
{
public:
A():i(100){countObject++;cout << "A() count=" << countObject << endl;};
//A(const A& a){countObject++;cout << "copy A() count=" << countObject << endl;};
~A(){countObject--;cout << "~A() count=" << countObject << endl;};
private:
int i;
};
A f(){
A x;
return x;
}
int main()
{
A a = f();
cout << "main over" << endl;
}
/**
A() count=1
main over
~A() count=0
*/
constructions vs. assignment
#include <string>
copy ctor guidelines (拷贝构造的指导方针)
不建议把拷贝构造写成 private 修饰的
只要定义一个类,不管有用没用,都把这三个方法写下来(构造,拷贝构造,析构);
java 里所有的对象的传递都是通过指针完成的,没有引用和拷贝构造这些事。