您好,登錄后才能下訂單哦!
這篇文章主要介紹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++中隱式類型轉換的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。