歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++ 隱式類類型轉化 Implicit Class-Type Conversions

一些類的構造器總是用explicit修飾,這是為什麼呢?它是做什麼用的呢?

我們先看看這個程序:

#include <iostream>

#include <string>

using namespace std;

class MyClass

{

public:

  MyClass(string n = "name") : name(n)

  {

      cout << "construct" << endl;

  }

  void myFunc(const MyClass &c) const

  {

      cout << name << endl;

  }

private:

  string name;

};

int main()

{

  MyClass c;

  string a = "xiaoming";

  c.myFunc(a);

  return 0;

}

運行結果:

construct

construct

name

從運行結果可以看到構造函數執行了兩次,分析程序,第一次調用時發生在MyClass c時,那麼第二此時只能是myFunc(a)中,實時上也如此。這裡是發生了隱式類類型轉化。中間把”xiaoming”的string類型傳遞給了myFunc函數,並臨時調用構造器生成一個臨時實例來執行這個myFunc函數。

某些地方我們期待那麼可以這麼用,但是如果我們不想發生隱式轉化(有時候這種轉化會很荒謬),那麼就使用explicit修飾構造器。這就將抑制由構造器定義的隱式轉化。我們加上後,再編譯就會編譯不過。

另外,explicit只需要在類裡聲明,在外部重復聲明將會報錯。

如果我們定義的類有explicit抑制了,我們卻想轉化,只能顯式轉化:c.myFunc(MyClass(a))。

Copyright © Linux教程網 All Rights Reserved