如何正确使用转换构造函数
How to correctly use converting constructors?
我读到C++编译器能够在提供合适的转换构造函数或操作数时隐式转换类型。事实上,我发现了看起来很像这样的示例代码:
class Dog{
private:
string name;
public:
Dog(string n):name(n){} //This as the converting constructor
}
int main(){
Dog d = "rover";
}
每当我运行此代码时,编译器都会抛出一条错误消息:
请求从"const char[6]"到非标量类型"Dog"的转换Dog d="漫游者";编译时,我添加了编译器选项-std=c++11
,所以它不应该是关于C++版本的,对吧
我在网上找到的例子(至少对我来说)看起来完全一样,所以我不知道这里出了什么问题
例如,我对此主题的投入来自于此视频:转换构造函数和重载运算符-新的moston
您还需要了解您使用的是复制初始化,而不是 直接初始化他们是不同的,你需要了解他们是如何做到的,以及他们与 d2大小写尝试将文字转换为Dog,然后将其复制(移动)到d2。但这将是双重转换: d1大小写构造d1,将参数传递给构造函数,因此只有一次转换 复制初始化没有指定"漫游者"作为构造函数的参数。上面写着"这里有些东西,但这里需要一个 在直接初始化的情况下,只是为函数(构造函数)提供参数。编译器将您提供的内容转换为声明的参数类型。explicit
的关系。您需要了解转换链是如何工作的,其中最多涉及一个用户定义的转换。Dog d1 ("rover");
Dog d2 = "rover";
const char*
到string
,然后string
到Dog
。const char*
到string
。(在这两种情况下,将const char [6]
提升为const char*
也在其中,但不计入允许的"唯一一个",属于不同的类别。)Dog
">这里是复制init声明语法的右侧,而不是任何可识别的函数。编译器必须找到合法的转换。
注意,"rover"
不是std::string
,而是const char[6]
(末尾有空字符)(可能衰减为const char*
),要使Dog d = "rover";
工作,需要将"rover"
转换为std::string
,然后再转换为Dog
。
但用户定义的转换不会在一次隐式转换中被考虑两次。
(重点矿井)
在隐式转换的第二阶段调用用户定义的转换函数,隐式转换由零个或一个转换构造函数或零或一个用户定义的转化函数组成。
您可以显式地将"rover"
转换为std::string
以使其工作。
Dog d = std::string("rover");
您需要另一个构造函数,它允许您从const char*
:进行构造
Dog(const char* n):name(n){}
请记住,"rover"
不是std::string
,类型不会被推导为隐式使用转换构造函数。正如@songyuanyao在他们的回答中提到的那样,转换只会进行一次。
另一种选择是写入:
Dog d = std::string("rover");
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- enable_if转换构造函数(静态强制转换,is_base_of)
- 为什么我需要在转换构造函数上引用 this->?
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 为什么不对转换构造函数进行隐式强制转换?
- 转换构造函数和运算符都存在且涉及显式性时的行为
- C++ 03 类模板 这是转换构造函数还是转换运算符?以及如何声明解决此问题的方法
- 使用完美转发的模板转换构造函数
- 转换构造函数的参数可以隐式转换吗?
- std::变量转换构造函数行为
- 隐式用户定义的转换不起作用,因为在编译C 时无法识别运算符和转换构造函数
- 为什么不调用模板类中的转换构造函数?
- 转换构造函数的隐式参数
- 转换构造函数:您如何解释C 中给定不同参数的函数
- C++变体:为什么转换构造函数需要大小.(类型)为非零
- C++变体用bool转换构造函数
- 在重载解析期间调用转换运算符,而不是在 c++17 中转换构造函数
- 为什么在没有赋值运算符的情况下调用转换构造函数
- 如何将转换构造函数与指针一起使用?
- 为什么在调用隐式类型转换构造函数之后直接是驱动器