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

C++ 为什么在这里调用转换构造函数,c++,constructor,C++,Constructor,我试图了解在代码中何时何地调用构造函数 我自己制作了一个简单的stringclass,它有以下几种可能性: String string1("hello world"); string1 = "Hello march!!!"; 关于后一个,这两个构造函数在String类中调用 按顺序呼叫 converting-constructor copy-constructor 我能理解为什么调用复制构造函数,而不是为什么调用转换构造函数 以下是这两个构造函数: 转换构造函数 String

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

我自己制作了一个简单的stringclass,它有以下几种可能性:

 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;
}
String::String(const char*ch):\u strprtr(0){
_strLen=strLen(ch)+1;
_strprpr=新字符[_strLen];
strncpy(_strPtr,ch,_strLen);
_strprtr[_strLen-1]='\0';
库特
我能理解为什么调用复制构造函数,而不是为什么调用转换构造函数

调用转换构造函数是因为在赋值时,由于没有采用
const char*
的赋值运算符,使用转换构造函数从RHS构造一个临时
字符串
,并用于将其赋值给LHS


请注意,副本取决于赋值运算符按值返回。这对于赋值运算符来说是不寻常的。通常这些运算符返回引用。

好的,首先是常量字符数组(这是字符串文字的类型)衰减为指向常量字符的指针。然后调用转换ctor以从常量字符*构造字符串。然后调用复制ctor以在赋值运算符的返回中构造字符串。您应该通过非常量引用返回以保持习惯用法。

您能解释一下,在不调用转换c的情况下,这将如何工作吗onstructor?您是否实现了赋值运算符?如果是,参数类型是什么?好的,转换是转换字符串文字。副本是赋值运算符的返回值。您应该通过ref返回。这不是调用隐式赋值运算符而不是复制运算符吗?@kec是的,但需要转换构造函数要构造一个可以从中赋值的
字符串
。@juanchopanza:是的,但这并不能解释复制构造函数。答案似乎在赋值的返回中。@kec OP没有询问复制构造函数,但是的,这解释了复制。