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. 当函数的返回值是类对象时,系统自动调用拷贝构造函数。
拷贝构造函数被调用的时机:
1. 当用类的一个对象去初始化该类的另一个对象(或引用)时系统自动调用拷贝构造函数实现拷贝赋值。
2. 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。
3. 当函数的返回值是类对象时,系统自动调用拷贝构造函数。
5
CMyString(const CMyString&)才是拷贝构造
CMyString(const CMyString&&) move构造
CMyString& operator = (const CMyString&) 拷贝赋值
CMyString str0 = “s0”;实际上是CMyString str0( “s0”);调用了CMyString(char *temStr)
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的使用就调用了拷贝构造函数。
}
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;
}
红色的这种才是调用拷贝构造函数,明显编译不通过。
{
CMyString str0 = “s0”;
CMyString str1 = CMyString(str0);
return 0;
}
红色的这种才是调用拷贝构造函数,明显编译不通过。