c++ - 为什么转换构造函数在这里被调用

标签 c++ constructor

我正在尝试了解在代码中调用构造函数的时间和位置。

我自己制作了具有以下可能性的字符串类:

 String string1("hello world");


 string1 = "Hello march!!!";

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

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

最佳答案

I can understand why the copy-constructor is called not really why the converting-constructor is called?

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

请注意,复制取决于您的赋值运算符按值返回的事实。这对于赋值运算符来说是不寻常的。通常这些返回一个引用。

关于c++ - 为什么转换构造函数在这里被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23475449/

相关文章:

C++20 模块 - 如何获取它们的文件名?

c++ - 像 C::C(const C&&) 这样的构造函数我们怎么调用它?除了禁止从 const 移动外,还有其他用途吗?

c++ - 如何在 vector 列表初始化时避免对象复制以及如何延长临时对象的生命周期

C++ 未初始化的类数组

c++ - Boost::Geometry如何获取多边形内点的坐标?

c++ - 无法计算位数作为输入

android - 如何让手机从 Qt Android 振动

c++ - 如何在 Haxe 中使用 C/C++ 库(如 NCurses)

c# - 如何在 C# 中使用私有(private)构造函数实例化对象?

python - 如何在Python中执行构造函数重载?