我试图了解代码中何时何地调用构造函数。
我创建了自己的、简单的、具有以下这些可能性的字符串类:
String string1("hello world");
string1 = "Hello march!!!";对于后一个构造函数,这两个构造函数在字符串类中按顺序调用.
converting-constructor
copy-constructor我能理解为什么调用复制构造函数,而不是真正为什么调用转换构造函数?
以下是这两个构造函数:
converting-constructor
String::String(const char* ch) : _strPtr(0) {
_strLen = strlen(ch) + 1;
_strPtr = new char[_strLen];
strncpy(_strPtr, ch, _strLen);
_strPtr[_strLen - 1] = '\0';
cout << "konverterings-constructor\n";
}copy-constructor
String::String(const String& string) {
_strLen = strlen(string._strPtr) + 1; // behöver ingen "djup-kopia" av vektorlängden.
if(string.getString()) {
_strPtr = new char[_strLen];
strncpy(_strPtr, string._strPtr, _strLen);
_strPtr[_strLen - 1] = '\0'; // null-terminering
} else {
_strPtr = 0;
}
cout << "copy-constructor\n";
}重载成员.赋值函数-运算符
String String::operator=(const String& string) {
if (this == &string) { // kontrollera om objektet är lika med sig självt.
return *this;
}
cout << "......\n";
delete [] getString();
_strLen = strlen(string.getString()) + 1;
if(string.getString()) {
_strPtr = new char[getLength()];
strncpy(_strPtr, string.getString(), _strLen);
_strPtr[_strLen - 1] = '\0'; // null-terminering
} else {
_strPtr = 0;
}
return *this;
}发布于 2014-05-05 14:53:27
我能理解为什么调用复制构造函数,而不是真正为什么调用转换构造函数?
之所以调用转换构造函数,是因为当您分配时,由于没有接受const char*的赋值运算符,因此使用转换构造函数从RHS构造临时String,并用于分配给LHS。
注意,副本可以归结为赋值运算符按值返回的事实。对于赋值操作符来说,这是不寻常的。通常,它们返回一个引用。
发布于 2014-05-05 15:04:11
好的,首先,const数组(它是字符串文本的类型)衰变到指向const的指针。然后调用转换ctor从const char *构造字符串。然后调用operator在赋值操作符的返回中构造一个字符串。你应该以非参照的方式返回,这样才是惯用的。
https://stackoverflow.com/questions/23475449
复制相似问题