Har*_*tel 4 c++ copy-constructor assignment-operator
我在Visual Studio 2015中练习'String'类实现(C++).我的类中有3个构造函数,而不是任何赋值运算符.
String();
String(char _c);
String(const char* _pc);
Run Code Online (Sandbox Code Playgroud)
在main(),我故意使用赋值运算符来检查代码的行为.
令我惊讶的是,它没有给出任何错误,并使用构造函数String(const char* _pc)为对象赋值.此外,在范围的最后,它调用析构函数两次.
在这种情况下,编辑器在幕后做什么?为什么?
这是我的代码:
class String {
private:
int capacity;
char* start;
public:
//Constructors
String();
String(const char* _pc);
//Destructor
~String();
}
String::String() :start(nullptr), capacity(0) {}
String::String(const char* _pc) :capacity(1) {
const char* buffer = _pc;
while (*(buffer++))
capacity++;
int temp_capacity = capacity;
if (temp_capacity)
start = new char[temp_capacity];
while (temp_capacity--) {
start[temp_capacity] = *(--buffer);
}
}
String::~String() {
if (capacity == 1)
delete start;
if (capacity > 1)
delete[] start;
}
int main() {
String s;
s="Hello World";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编辑器在幕后做什么?
鉴于s="Hello World";,
String从"Hello World"via 构造(隐式转换)临时String::String(const char*).
s是从临时通过隐式声明的复制赋值operator(String::operator=(String&&))分配的.
顺便说一句,你可能会标记String::String(const char*) explicit禁止在步骤1发生的隐式转换.