以下“最小”示例应显示规则 3(半)的使用。
#include <algorithm>
#include <iostream>
class C
{
std::string* str;
public:
C()
: str(new std::string("default constructed"))
{
std::cout << "std ctor called" << std::endl;
}
C(std::string* _str)
: str(_str)
{
std::cout << "string ctor called, "
<< "address:" << str << std::endl;
}
// copy ctor: does a hard copy of the string
C(const C& other)
: str(new std::string(*(other.str)))
{
std::cout << "copy ctor called" << std::endl;
}
friend void swap(C& c1, C& c2) {
using std::swap;
swap(c1.str, c2.str);
}
const C& operator=(C src) // rule of 3.5
{
using std::swap;
swap(*this, src);
std::cout << "operator= called" << std::endl;
return *this;
}
C get_new() {
return C(str);
}
void print_address() { std::cout << str << std::endl; }
};
int main()
{
C a, b;
a = b.get_new();
a.print_address();
return 0;
}
像这样编译它(g ++版本:4.7.1):
g++ -Wall test.cpp -o test
现在,应该怎么办?我假设该行将a = b.get_new();
制作一个硬拷贝,即分配一个新字符串。原因:operator=()
在这个设计模式中,它的参数是典型的,每个值,它调用一个复制 ctor,它将进行深度复制。到底发生了什么?
std ctor called
std ctor called
string ctor called, address:0x433d0b0
operator= called
0x433d0b0
复制 ctor从未被调用过,因此,复制是软的——两个指针是相等的。为什么不调用复制ctor?