【问题标题】:Why the converting-constructor is called here为什么在这里调用转换构造函数
【发布时间】:2014-05-05 14:50:27
【问题描述】:

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

我自己创建了一个简单的字符串类,它具有以下可能性:

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

【问题讨论】:

  • 您能否解释一下您希望它如何调用转换构造函数的情况下工作?
  • 你实现了赋值运算符吗?如果有,参数类型是什么?
  • 好了,转换就是转换字符串字面量。副本是您的赋值运算符的返回。您应该按参考返回。

标签: c++ constructor


【解决方案1】:

我可以理解为什么调用复制构造函数而不是真正为什么调用转换构造函数?

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

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

【讨论】:

  • 这不是调用隐式赋值运算符而不是复制ctor吗?
  • @kec 可以,但是需要转换构造函数来构造一个可以从中赋值的String
  • @juanchopanza:是的,但这并不能解释复制构造函数。答案似乎在作业的回报中。
  • @kec OP 没有询问复制构造函数,但是是的,它解释了复制。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-04
    • 2017-04-07
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多