2014-05-05 76 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引用返回,以獲得慣用效果。

相關問題