|
发表于 2022-1-12 16:05:56
|
显示全部楼层
本帖最后由 zhengl33 于 2022-1-12 16:48 编辑
举列说明:
class CTest
{
public:
CTest() : m_num(0), m_szpStr(NULL) { } ///无参数构造函数
CTest(int num) : m_num(num), m_szpStr(NULL) { } ///一个参数构造函数
CTest(int num, char* szpStr) : m_num(num) ///两个参数构造函数
{
if( szpStr )
{
int len = strlen(szpStr);
m_szpStr = new char[len + 1]{0};
strcpy(m_szpStr, szpStr);
}
else
m_szpStr = NULL;
}
CTest(CTest& Test) : m_num(Test.m_num) ///拷贝构造函数
{
if( Test.m_szpStr )
{
int len = strlen(Test.m_szpStr);
m_szpStr = new char[len + 1]{0};
strcpy(m_szpStr, Test.m_szpStr);
}
else
m_szpStr = NULL;
}
private:
int m_num;
char* m_szpStr;
}
1.
普通构造函数:参数可以你自己定义,可以没有,也可以多个。例如CTest()、 CTest(int num) 与 CTest(int num, char* szpStr)。
拷贝构造函数:参数只能为一个本类的对象。例如: CTest(CTest& Test);
2.
拷贝构造函数,不会自动调用,你需要调用的时候调用。
比如调用的时候:
CTest test1();
CTest test2(num); //num为实参。
CTest test3(num,str); //str为实参。
CTest test4(test1);
调用时几种写法都是可以的。
3.
注意:
通常情况下(无实际代码,不好判断,只能说通常情况),指针类型成员变量,例如char* 不能直接用 = 赋值,需要拷贝,不然很容易引起内存泄漏。
至于C++11 和移动语义区分,建议去看看 移动构造函数 的教程。 |
|