欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中隱式類型轉(zhuǎn)換學習筆記

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

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

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

在std::ref的實現(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的隱式類型轉(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(); }

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

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

#include <iostream>
/*
 *
 * c++ operator的隱式類型轉(zhuǎn)換
 * 參見std::ref的實現(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;
}

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

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

在c++ primer一書中提到

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

看如下示例:

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

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

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

有些時候我們并不希望發(fā)生隱式轉(zhuǎn)換,不期望的隱式轉(zhuǎn)換可能出現(xiàn)意外的結(jié)果,explicit關鍵詞可以禁止之類隱式轉(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;
};

再次運行程序出現(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'

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

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

只能感嘆C++語言的博大精深,這篇文章還只是對隱式轉(zhuǎn)換的入門級總結(jié)。

參考:

《C++ Primer》隱式類類型轉(zhuǎn)換學習整理

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

相關文章

  • C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)

    C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt 使用QDialog實現(xiàn)界面遮罩的示例(蒙版)

    Qt 使用QDialog實現(xiàn)界面遮罩的示例(蒙版)

    界面遮罩在很多時候都可以用到,例如彈窗,本文主要介紹了Qt 使用QDialog實現(xiàn)界面遮罩的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • C++實現(xiàn)編寫二維碼的示例代碼

    C++實現(xiàn)編寫二維碼的示例代碼

    這篇文章主要為大家詳細介紹如何基于C++實現(xiàn)編寫二維碼的功能,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-06-06
  • VC6.0常見編譯錯誤提示附解決方法

    VC6.0常見編譯錯誤提示附解決方法

    這篇文章主要介紹了VC++6.0編譯過程中常遇到的一些錯誤提示并給出了錯誤原因與分析,需要的朋友尅參考下
    2013-07-07
  • C語言入門篇--關鍵字static詳解

    C語言入門篇--關鍵字static詳解

    本篇文章是C語言系列基礎篇,C語言中,static是用來修飾變量和函數(shù):1.修飾局部變量–>靜態(tài)局部變量2.修飾全局變量–>靜態(tài)全局變量3.修飾函數(shù)–>靜態(tài)函數(shù)
    2021-08-08
  • 二叉樹遍歷 非遞歸 C++實現(xiàn)代碼

    二叉樹遍歷 非遞歸 C++實現(xiàn)代碼

    對于二叉樹,有前序、中序以及后序三種遍歷方法。因為樹的定義本身就是遞歸定義,因此采用遞歸的方法去實現(xiàn)樹的三種遍歷不僅容易理解而且代碼很簡潔。而對于樹的遍歷若采用非遞歸的方法,就要采用棧去模擬實現(xiàn)
    2013-09-09
  • 枚舉和宏的區(qū)別詳細解析

    枚舉和宏的區(qū)別詳細解析

    枚舉常量具有類型,但宏沒有類型,枚舉變量具有與普通變量相同的諸如作用域、值等性質(zhì),但宏沒有,宏不是語言的一部分,它是一種預處理替換符
    2013-09-09
  • C語言?typedef的用法示例詳解

    C語言?typedef的用法示例詳解

    typedef是在C和C++編程語言中的一個關鍵字,作用是為現(xiàn)有的數(shù)據(jù)類型(int、float、char……)創(chuàng)建一個新的名字,目的是為了使代碼方便閱讀和理解,這篇文章主要介紹了C語言typedef的使用,需要的朋友可以參考下
    2023-06-06
  • C++課程設計之運動會管理系統(tǒng)

    C++課程設計之運動會管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++課程設計之運動會管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 淺析C/C++ 中return *this和return this的區(qū)別

    淺析C/C++ 中return *this和return this的區(qū)別

    return *this返回的是當前對象的克隆或者本身,return this返回當前對象的地址,下面通過本文給大家介紹C/C++ 中return *this和return this的區(qū)別,感興趣的朋友一起看看吧
    2019-10-10

最新評論