亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中隱式類型轉換的示例分析

發布時間:2021-06-15 15:39:40 來源:億速云 閱讀:149 作者:小新 欄目:編程語言

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

1 operator隱式類型轉換

1.1 std::ref源碼中reference_wrapper隱式類型轉換

在std::ref的實現中有如下一段代碼:

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的隱式類型轉換
  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(); }

就是用于類型轉換。

1.2 簡單的例子-實現一個class轉為int的示例

#include <iostream>
/*
 *
 * c++ operator的隱式類型轉換
 * 參見std::ref的實現
 */ 
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實現隱式類型轉換,c++中還可以通過構造函數實現。

2 構造函數實現隱式類型轉換

在c++ primer一書中提到

可以用單個實參來調用的構造函數定義了從形參類型到該類類型的一個轉換

看如下示例:

#include <iostream>
/*
 *
 * c++ 構造的隱式類型轉換
 * 參見std::ref的實現
 */
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);
 //通過構造函數實現了隱式類型轉換
 a.fun(b); //輸出結果為3
 return 0;
}

特別需要注意的是單個實參,構造函數才會有隱式轉換,一個條件不滿足都是不行。

3 使用explicit關鍵字避免構造函數隱式轉換

有些時候我們并不希望發生隱式轉換,不期望的隱式轉換可能出現意外的結果,explicit關鍵詞可以禁止之類隱式轉換,將上述class A的構造函數改為如下

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;
};

再次運行程序出現提示:

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'

這個時候調用方式修改更改為:

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

以上是“C++中隱式類型轉換的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

肇源县| 高陵县| 尚志市| 赣州市| 桃源县| 全南县| 彰武县| 观塘区| 安远县| 堆龙德庆县| 宝坻区| 万宁市| 化德县| 韶关市| 土默特右旗| 门源| 江陵县| 乌鲁木齐市| 赤壁市| 金秀| 宁夏| 肥东县| 烟台市| 宝丰县| 普宁市| 儋州市| 盐城市| 长岛县| 定兴县| 丹凤县| 泸溪县| 昌乐县| 天长市| 宽甸| 昌宁县| 邵阳县| 烟台市| 高邮市| 北流市| 车致| 象山县|