真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++中隱式類型轉(zhuǎn)換的示例分析

這篇文章主要介紹C++中隱式類型轉(zhuǎn)換的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

常德網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)自2013年起到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。

1 operator隱式類型轉(zhuǎn)換

1.1 std::ref源碼中reference_wrapper隱式類型轉(zhuǎn)換

在std::ref的實(shí)現(xiàn)中有如下一段代碼:

template
 class reference_wrapper
 : public _Reference_wrapper_base::type>
 {
  _Tp* _M_data;

 public:
  typedef _Tp type;

  reference_wrapper(_Tp& __indata) noexcept
  : _M_data(std::__addressof(__indata))
  { }

  reference_wrapper(_Tp&&) = delete;

  reference_wrapper(const reference_wrapper&) = default;

  reference_wrapper&
  operator=(const reference_wrapper&) = default;
  //operator的隱式類型轉(zhuǎn)換
  operator _Tp&() const noexcept
  { return this->get(); }

  _Tp&
  get() const noexcept
  { return *_M_data; }

  template
 typename result_of<_Tp&(_Args&&...)>::type
 operator()(_Args&&... __args) const
 {
  return __invoke(get(), std::forward<_Args>(__args)...);
 }
 };

注意看operator操作符重載:

operator _Tp&() const noexcept
  { return this->get(); }

就是用于類型轉(zhuǎn)換。

1.2 簡(jiǎn)單的例子-實(shí)現(xiàn)一個(gè)class轉(zhuǎn)為int的示例

#include 
/*
 *
 * c++ operator的隱式類型轉(zhuǎn)換
 * 參見std::ref的實(shí)現(xiàn)
 */ 
void f(int a)
{
 std::cout << "a = " << a << std::endl;
}
class A{
 public:
 A(int a):num(a){}
 ~A() {}

 operator int()
 {
  return num;
 }
 int num;
};

int main()
{
 A a(1);
 std::cout << a + 1 << std::endl;
 f(a);
 return 0;
}

當(dāng)然除了通過operator實(shí)現(xiàn)隱式類型轉(zhuǎn)換,c++中還可以通過構(gòu)造函數(shù)實(shí)現(xiàn)。

2 構(gòu)造函數(shù)實(shí)現(xiàn)隱式類型轉(zhuǎn)換

在c++ primer一書中提到

可以用單個(gè)實(shí)參來調(diào)用的構(gòu)造函數(shù)定義了從形參類型到該類類型的一個(gè)轉(zhuǎn)換

看如下示例:

#include 
/*
 *
 * c++ 構(gòu)造的隱式類型轉(zhuǎn)換
 * 參見std::ref的實(shí)現(xiàn)
 */
class B{
 public:
 B(int a):num(a){}
 ~B() {}

 int num;
};

class A{
 public:
 A(int a):num(a){}
 A(B b):num(b.num){}
 ~A() {}

 int fun(A a)
 {
  std::cout << num + a.num << std::endl;
 }

 int num;
};

int main()
{
 B b(1);
 A a(2);
 //通過構(gòu)造函數(shù)實(shí)現(xiàn)了隱式類型轉(zhuǎn)換
 a.fun(b); //輸出結(jié)果為3
 return 0;
}

特別需要注意的是單個(gè)實(shí)參,構(gòu)造函數(shù)才會(huì)有隱式轉(zhuǎn)換,一個(gè)條件不滿足都是不行。

3 使用explicit關(guān)鍵字避免構(gòu)造函數(shù)隱式轉(zhuǎn)換

有些時(shí)候我們并不希望發(fā)生隱式轉(zhuǎn)換,不期望的隱式轉(zhuǎn)換可能出現(xiàn)意外的結(jié)果,explicit關(guān)鍵詞可以禁止之類隱式轉(zhuǎn)換,將上述class A的構(gòu)造函數(shù)改為如下

class A{
 public:
 A(int a):num(a){}
 explicit A(B b):num(b.num){}
 ~A() {}

 int fun(A a)
 {
  std::cout << num + a.num << std::endl;
 }

 int num;
};

再次運(yùn)行程序出現(xiàn)提示:

op2.cpp: In function ‘int main()':
op2.cpp:29:12: error: no matching function for call to ‘A::fun(B&)'
a.fun(b);
^
op2.cpp:16:9: note: candidate: int A::fun(A)
int fun(A a)
^~~
op2.cpp:16:9: note: no known conversion for argument 1 from ‘B' to ‘A'

這個(gè)時(shí)候調(diào)用方式修改更改為:

int main()
{
 B b(1);
 A a(2);
 a.fun(A(b));
 return 0;
}

以上是“C++中隱式類型轉(zhuǎn)換的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


分享標(biāo)題:C++中隱式類型轉(zhuǎn)換的示例分析
標(biāo)題路徑:http://weahome.cn/article/igjsis.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部