1.Test(const Test &p){} 拷贝构造函数的调用时机
a.用一个对象去初始化另一个对象 Test t1(1,2); Test t2 = t1;
b.Test t2(t1)
c.void f(Test t){} 调用f时会调用拷贝构造函数
d.Test f() {Test t(); return t}返回匿名对象时会调用拷贝构造函数(返回的是一个新的匿名对象)
Test t2 = f();用匿名对象初始化t2,此时c++编译器直接把匿名对象转成t2
Test t3(); t3 = f();匿名对象被析构
2.
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Name
{
public:
Name(const char * myp)
{
len = strlen(myp);
p = (char*)malloc(len + 1);
strcpy(p, myp);
}
~Name()
{
if (p != NULL)
{
free(p);
p = NULL;
len = 0;
}
}
protected:
private:
char *p;
int len;
};
void mainobject()
{
Name obj1("abcded");
Name obj2 = obj1;
}
void main()
{
mainobject();
cout << "hello.." << endl;
system("pause");
return;
}
在执行Name obj2 = obj1是执行了默认的拷贝构造函数(C++编译器提供)
浅拷贝只是复制了对象的值,obj2的p指针同样指向相同的内存,当析构obj2时内存空间被释放,当析构obj1时p指向了垃圾内存。使用等号赋值时也会产生同样的问题。解决方法手工的编写拷贝构造函数,使用深拷贝。
3.构造函数的初始化列表,解决了在b类中组合了一个a类对象(使用了有参构造函数)。先执行被组合对象的构造函数,如果被组合对象有多个,按照定义顺序来,而不是初始化列表的顺序,析构函数和构造函数的调用顺序相反。