为什么在这里调用转换构造函数

时间:2014-05-05 14:50:28

标签: c++ constructor

我试图了解代码中何时何地调用构造函数。

我制作了自己的,简单的,具有这些可能性的字符串类:

 String string1("hello world");


 string1 = "Hello march!!!";

关于后者,这两个构造函数在String类中调用 按顺序调用......

 converting-constructor

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

2 个答案:

答案 0 :(得分:2)

  

我能理解为什么调用copy-constructor并不是为什么调用转换构造函数?

调用转换构造函数是因为在分配时,由于您没有使用const char*的赋值运算符,因此使用转换构造函数从RHS构造临时String,并且用于分配给LHS。

请注意,副本归结为赋值运算符按值返回。这对于赋值运算符来说是不寻常的。通常这些都会返回参考。

答案 1 :(得分:0)

好的,首先const char的数组(它是字符串文字的类型)衰减到指向const char的指针。然后调用转换ctor从const char *构造一个String。然后调用copy ctor来在赋值运算符的返回值中构造一个String。你应该通过非const引用返回到惯用语。