i你哟 发表于 2023-10-28 19:05:43

关于explicit

explicit Sales_data(const string &s):bookNo(s){}
int main()
{
        string null_isbn("9-999-9999-9");
        Sales_data item1(null_isbn);
        Sales_data item2("9-999-99999-9");
        return 0;
}
这里的item1,因为其需要一个字符转所以不需要进行隐式转换,所以加了explicit和没有加一样的效果
但是item2,他这个是经过一次转换的由字面值转换成字符串,如果加了explicit,这不就不能转换了吗为什么还能正常运行?
还有一个问题(书上说item1经历了一次类型转换,item2经历了两次,它们需要的不都是字符串吗?为什么还要转换成Sales-data这个类型?)谢谢!

isdkz 发表于 2023-10-28 19:05:55

对于第一个问题,即为什么即使加了explicit关键字,item2 仍然可以正常运行。

explicit关键字的作用是防止隐式类型转换,它只对单参数的构造函数有效。在这个例子中,item2 的构造函数Sales_data(const string &s)是一个单参数的构造函数,但是它的参数是一个字符数组,而不是一个string对象。当我们传入一个字符数组时,编译器会自动进行一次string类型的隐式转换,将字符数组转换为string对象,然后再调用构造函数进行对象的构造。因此,即使加了explicit关键字,编译器仍然会进行一次隐式转换,将字符数组转换为string对象,然后再调用构造函数进行对象的构造。

对于第二个问题,即为什么需要将字符数组转换为Sales_data类型。

在这个例子中, Sales_data类型的对象需要一个string类型的参数进行构造。当我们传入一个字符数组时,编译器会自动进行一次string类型的隐式转换,将字符数组转换为string对象,然后再调用构造函数进行对象的构造。这样做的目的是为了方便使用,让我们能够直接使用字符数组来构造Sales_data对象,而不需要手动进行类型转换。

陶远航 发表于 2023-10-28 19:06:32

在C++中,explicit关键字用于防止不希望发生的隐式类型转换。当你在构造函数前加上explicit关键字时,你告诉编译器这个构造函数只能用于显式类型转换,不能用于隐式类型转换。

在你的例子中,Sales_data的构造函数接受一个string参数。当你创建一个Sales_data对象并传入一个string时,这个string被显式地转换为Sales_data类型。这就是为什么item1和item2都能正常运行,即使你在构造函数前加了explicit关键字。

对于item1,你传入的是一个已经定义好的string对象,所以没有发生任何类型转换。对于item2,你传入的是一个字面量字符串,这个字面量字符串首先被隐式地转换为string类型,然后再被显式地转换为Sales_data类型,所以item2经历了两次类型转换。

至于为什么需要转换成Sales_data类型,这是因为你在创建Sales_data对象。当你创建一个对象时,你需要提供与该对象类型的构造函数匹配的参数。在这个例子中,Sales_data的构造函数接受一个string参数,所以你需要提供一个string来创建Sales_data对象。这个过程就涉及到了类型转换,因为你需要将你提供的参数转换为构造函数所需的类型。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
页: [1]
查看完整版本: 关于explicit