Code Bye

拷贝构造函数的问题

class CMyString
{
public:
	CMyString(){}
	CMyString(char *temStr) : str(temStr){printf("b0");}
private:
	string str;
	CMyString(const CMyString&){printf("b1");}
	CMyString(const CMyString&&){printf("b2");}
	CMyString& operator = (const CMyString&){return *this;};
};
int _tmain(int argc, _TCHAR* argv[])
{
	CMyString str0 = "s0";
	return 0;
}

如上代码,为什么CMyString str0 = “s0”;能通过编译? 此类的拷贝构造函数不是private的吗?

解决方案

10

谁说他会调用拷贝构造?
拷贝构造函数被调用的时机:
1. 当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值。
2. 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。
3. 当函数的返回值是类对象时,系统自动调用拷贝构造函数。

5

CMyString(const CMyString&)才是拷贝构造
CMyString(const CMyString&&)   move构造
CMyString& operator = (const CMyString&)   拷贝赋值
CMyString str0 = “s0”;实际上是CMyString str0( “s0”);调用了CMyString(char *temStr)

10

调用的是CMyString(char *temStr) : str(temStr){printf(“b0”);}构造函数,你参数类型是const char*,这个构造函数是公有的啊

3

CMyString str0 = “s0”;调用的是构造函数:
CMyString(char *temStr) : str(temStr){printf(“b0”);}
不是拷贝构造函数。
下面是调用拷贝构造函数的一个例子
void func( CMyString strObj)
{
//这个地方直接对strObj的使用就调用了拷贝构造函数。
}

2

int _tmain(int argc, _TCHAR* argv[])
{
CMyString str0 = “s0”;
CMyString str1 = CMyString(str0);
return 0;
}
红色的这种才是调用拷贝构造函数,明显编译不通过。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明拷贝构造函数的问题