鱼C论坛

 找回密码
 立即注册
查看: 877|回复: 2

[已解决]关于explicit

[复制链接]
发表于 2023-10-28 19:05:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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这个类型?)谢谢!
最佳答案
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  对象,而不需要手动进行类型转换。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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  对象,而不需要手动进行类型转换。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 17:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表