1. 何时复制构造
复制构造用于将个对象复制到新创建对象中也就是说它用于化过程中而不是常规赋值过程中类复制构造原型通常如下:
_name(const _name&);
它接受个指向类对象常量引用作为参数例如String类复制构造原型如下:
String(const String&);
新建个对象并将其化为同类现有对象时复制构造都将被这在很多情况下都可能发生最常见情况是将新对象显示地化为现有对象例如假设motto是个String对象则下面4种声明都将复制构造:
String ditto(motto);
String metoo = motto;
String also = String(motto);
String *pString = String(motto);
其中中间2种声明可能会使用复制构造直接创建metto和also也可能会使用复制构造生成个临时对象然后将临时对象内容赋给metoo和also这取决于具体实现最后种声明使用motto化个匿名对象并将新对象地址赋给pString指针
2. 何时赋值构造
赋值构造是通过重载赋值操作符实现这种操作符原型如下:
Class_name& Class_name::operator=(const Class_name&);
它接受并返回个指向类对象引用例如String 类赋值操作符原型如下:
String& String::operator=(const String&);
将已有对象赋给另个对象时将使用重载赋值操作符:
String headline1("test");
String knot;
knot = headline1;
化对象时并不定会使用赋值操作符:
String metoo = knot;
这里metoo是个新创建对象被化为knot值因此使用复制构造不过正如前面指出实现时也可能分两步来处理这条语句:使用复制构造创建个临时对象然后通过赋值将临时对象值复制到新对象中这就是说化总是会复制构造而使用=操作符时也可能赋值操作符
例子代码如下:
# <iostream>
using std;
Test
{
public:
Test;
~Test;
Test(const Test& t);
Test& operator=(const Test& t);
private:
t1;
};
Test::Test
{
cout<<"构造"<<endl;
}
Test::~Test
{
cout<<"析构"<<endl;
}
Test::Test(const Test& t)
{
cout<<"复制构造"<<endl;
}
Test& Test::operator =(const Test& t)
{
cout<<"赋值构造"<<endl;
t1 = t.t1;
*this;
}
void
{
Test t1;
Test t2 = t1;
Test t3;
t3 = t1;
}
输出如下:
构造
复制构造
构造
赋值构造
析构
析构
析构
最新评论