最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中隱式類(lèi)型轉(zhuǎn)換學(xué)習(xí)筆記

 更新時(shí)間:2020年02月25日 09:31:30   作者:dnsir  
在本篇文章里小編給大家整理的是一篇關(guān)于C++中隱式類(lèi)型轉(zhuǎn)換學(xué)習(xí)筆記內(nèi)容,有興趣的跟著小編來(lái)學(xué)習(xí)下吧。

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

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

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

template<typename _Tp>
 class reference_wrapper
 : public _Reference_wrapper_base<typename remove_cv<_Tp>::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的隱式類(lèi)型轉(zhuǎn)換
  operator _Tp&() const noexcept
  { return this->get(); }

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

  template<typename... _Args>
 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(); }

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

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

#include <iostream>
/*
 *
 * c++ operator的隱式類(lèi)型轉(zhuǎn)換
 * 參見(jià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)然除了通過(guò)operator實(shí)現(xiàn)隱式類(lèi)型轉(zhuǎn)換,c++中還可以通過(guò)構(gòu)造函數(shù)實(shí)現(xiàn)。

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

在c++ primer一書(shū)中提到

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

看如下示例:

#include <iostream>
/*
 *
 * c++ 構(gòu)造的隱式類(lèi)型轉(zhuǎn)換
 * 參見(jià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);
 //通過(guò)構(gòu)造函數(shù)實(shí)現(xiàn)了隱式類(lèi)型轉(zhuǎn)換
 a.fun(b); //輸出結(jié)果為3
 return 0;
}

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

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

有些時(shí)候我們并不希望發(fā)生隱式轉(zhuǎn)換,不期望的隱式轉(zhuǎn)換可能出現(xiàn)意外的結(jié)果,explicit關(guān)鍵詞可以禁止之類(lèi)隱式轉(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++語(yǔ)言的博大精深,這篇文章還只是對(duì)隱式轉(zhuǎn)換的入門(mén)級(jí)總結(jié)。

參考:

《C++ Primer》隱式類(lèi)類(lèi)型轉(zhuǎn)換學(xué)習(xí)整理

以上就是C++中隱式類(lèi)型轉(zhuǎn)換學(xué)習(xí)筆記的詳細(xì)內(nèi)容,更多關(guān)于C++中隱式類(lèi)型轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語(yǔ)言由淺入深講解線程的定義

    C語(yǔ)言由淺入深講解線程的定義

    這篇文章主要介紹了C語(yǔ)言中線程的基礎(chǔ)知識(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C++ 數(shù)據(jù)結(jié)構(gòu) 堆排序的實(shí)現(xiàn)

    C++ 數(shù)據(jù)結(jié)構(gòu) 堆排序的實(shí)現(xiàn)

    這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu) 堆排序的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++ 基于BFS算法的走迷宮自動(dòng)尋路的實(shí)現(xiàn)

    C++ 基于BFS算法的走迷宮自動(dòng)尋路的實(shí)現(xiàn)

    這篇文章主要為大家介紹了C++ 基于BFS算法實(shí)現(xiàn)走迷宮自動(dòng)尋路,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 詳解C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實(shí)現(xiàn)

    詳解C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實(shí)現(xiàn)

    這篇文章主要介紹了C++中構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)和賦值函數(shù)的區(qū)別和實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • C語(yǔ)言菜鳥(niǎo)基礎(chǔ)教程之判斷

    C語(yǔ)言菜鳥(niǎo)基礎(chǔ)教程之判斷

    C語(yǔ)言判斷結(jié)構(gòu)要求程序員指定一個(gè)或多個(gè)要評(píng)估或測(cè)試的條件,以及條件為真時(shí)要執(zhí)行的語(yǔ)句(必需的)和條件為假時(shí)要執(zhí)行的語(yǔ)句(可選的)
    2017-10-10
  • 關(guān)于C++內(nèi)部類(lèi)的介紹與使用示例

    關(guān)于C++內(nèi)部類(lèi)的介紹與使用示例

    今天小編就為大家分享一篇關(guān)于關(guān)于C++內(nèi)部類(lèi)的介紹與使用示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解

    C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解

    這篇文章主要介紹了C++中回調(diào)函數(shù)及函數(shù)指針的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • Qt音視頻開(kāi)發(fā)之實(shí)現(xiàn)ffmpeg視頻旋轉(zhuǎn)顯示

    Qt音視頻開(kāi)發(fā)之實(shí)現(xiàn)ffmpeg視頻旋轉(zhuǎn)顯示

    這篇文章主要為大家詳細(xì)介紹了在Qt音視頻開(kāi)發(fā)中如何利用ffmpeg實(shí)現(xiàn)視頻旋轉(zhuǎn)顯示,文中的實(shí)現(xiàn)步驟講講清晰,感興趣的小伙伴可以了解一下
    2023-03-03
  • C語(yǔ)言實(shí)現(xiàn)自行車(chē)存放管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)自行車(chē)存放管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)自行車(chē)存放管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++簡(jiǎn)明講解缺省參數(shù)與函數(shù)重載的用法

    C++簡(jiǎn)明講解缺省參數(shù)與函數(shù)重載的用法

    所謂缺省參數(shù),顧名思義,就是在聲明函數(shù)的某個(gè)參數(shù)的時(shí)候?yàn)橹付ㄒ粋€(gè)默認(rèn)值,在調(diào)用該函數(shù)的時(shí)候如果采用該默認(rèn)值,你就無(wú)須指定該參數(shù)。C++ 允許多個(gè)函數(shù)擁有相同的名字,只要它們的參數(shù)列表不同就可以,這就是函數(shù)的重載,借助重載,一個(gè)函數(shù)名可以有多種用途
    2022-06-06

最新評(píng)論

儋州市| 定日县| 洪湖市| 万全县| 阳谷县| 改则县| 沙田区| 枞阳县| 六枝特区| 信丰县| 成都市| 东莞市| 金阳县| 南江县| 巍山| 浮山县| 米泉市| 安顺市| 资阳市| 福州市| 偃师市| 南丰县| 景东| 泸州市| 霍山县| 台南市| 大姚县| 蒙城县| 滦南县| 常宁市| 罗城| 盐边县| 永清县| 绵竹市| 望都县| 黄梅县| 葵青区| 余姚市| 西盟| 浦城县| 天峻县|