2014-05-05 74 views
0

我想了解在代码中调用构造函数的时间和位置。为什么在这里调用转换构造函数

我做我自己,虽然简单,stringclass有这些可能性:

String string1("hello world"); 


string1 = "Hello march!!!"; 

关于后者,这两个构造函数其中为了叫串级 叫...

converting-constructor 

copy-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"; 
} 

拷贝构造

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; 
} 
+0

你能解释一下,你会如何期望这个工作*没有*调用转换构造函数? – hvd

+0

您是否实施了赋值运算符?如果是这样,参数类型是什么? – kec

+2

好的,转换是转换字符串文字。该副本是您分配操作员的返回。你应该通过ref返回。 – kec

回答

2

我可以理解为什么拷贝构造函数被调用不是真的,为什么转换,构造函数被调用?

的转换构造函数被调用,因为当你指定的,因为你没有一个赋值操作符是需要const char*,临时String从RHS使用转换构造函数构造,并用于分配给LHS。

请注意,该副本取决于您的赋值运算符按值返回的事实。这对于赋值操作员来说是不寻常的。通常这些会返回一个参考。

+0

这不会称为隐式赋值运算符而不是复制ctor吗? – kec

+0

@kec是的,但需要转换构造函数来构造可以从中分配的“String”。 – juanchopanza

+0

我做了一个更新 – user2991252

0

好的,首先const char(它是字符串文字的类型)的数组衰减到一个指向const char的指针。然后转换ctor被调用来从const char *构造一个字符串。然后复制ctor被调用来在你赋值操作符的返回中构造一个String。您应该通过非const引用返回,以获得惯用效果。

相关问题