什么是C ++中的转换构造函数?它是为了什么?

什么是C ++中的转换构造函数?它是为了什么?

我听说C ++有一些叫做“转换构造函数”或“转换构造函数”的东西。这些是什么,它们的用途是什么?我在这段代码中看到了它:

class MyClass{
  public:
     int a, b;
     MyClass( int i ) {}}

 int main(){
    MyClass M = 1 ;}


慕标琳琳
浏览 407回答 3
3回答

慕勒3428872

使用转换构造函数隐式转换让我们在问题中做出更复杂的例子class&nbsp;MyClass{ &nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a,&nbsp;b; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass(&nbsp;int&nbsp;i&nbsp;)&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass(&nbsp;const&nbsp;char*&nbsp;n,&nbsp;int&nbsp;k&nbsp;=&nbsp;0&nbsp;)&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass(&nbsp;MyClass&&nbsp;obj&nbsp;)&nbsp;{}}前两个构造函数正在转换构造函数。第三个是复制构造函数,因此它是另一个转换构造函数。转换构造函数允许从参数类型到构造函数类型的隐式转换。这里,第一个构造函数允许从一个int类转换为一个对象MyClass。第二个构造函数允许从字符串转换为类的对象MyClass。第三......从班级MyClass的对象到班级的对象MyClass!要成为转换构造函数,构造函数必须具有单个参数(在第二个参数中,第二个参数具有一个默认值)并且不使用关键字进行声明explicit。然后,main中的初始化可能如下所示:int&nbsp;main(){ &nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;M&nbsp;=&nbsp;1&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;which&nbsp;is&nbsp;an&nbsp;alternative&nbsp;to &nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;M&nbsp;=&nbsp;MyClass(1)&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;M&nbsp;=&nbsp;"super"&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;which&nbsp;is&nbsp;an&nbsp;alternative&nbsp;to &nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;M&nbsp;=&nbsp;MyClass("super",&nbsp;0)&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;or &nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;M&nbsp;=&nbsp;MyClass("super")&nbsp;;}显式关键字和构造函数现在,如果我们使用了explicit关键字怎么办?class&nbsp;MyClass{ &nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a,&nbsp;b; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;explicit&nbsp;MyClass(&nbsp;int&nbsp;i&nbsp;)&nbsp;{}}然后,编译器不会接受&nbsp;&nbsp;&nbsp;int&nbsp;main() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;M&nbsp;=&nbsp;1&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;}因为这是隐式转换。相反,必须写&nbsp;&nbsp;&nbsp;int&nbsp;main() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;M(1)&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;M&nbsp;=&nbsp;MyClass(1)&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass*&nbsp;M&nbsp;=&nbsp;new&nbsp;MyClass(1)&nbsp;; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;M&nbsp;=&nbsp;(MyClass)1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;M&nbsp;=&nbsp;static_cast<MyClass>(1); &nbsp;&nbsp;&nbsp;&nbsp;}explicit&nbsp;始终使用关键字来防止构造函数的隐式转换,它适用于类声明中的构造函数。

幕布斯7119047

转换构造函数是单参数构造函数,声明时没有显式的函数说明符。编译器使用转换构造函数将对象从第一个参数的类型转换为转换构造函数类的类型。
打开App,查看更多内容
随时随地看视频慕课网APP