C++中隱式類型轉(zhuǎn)換學(xué)習(xí)筆記
1 operator隱式類型轉(zhuǎn)換
1.1 std::ref源碼中reference_wrapper隱式類型轉(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的隱式類型轉(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 簡(jiǎn)單的例子-實(shí)現(xiàn)一個(gè)class轉(zhuǎn)為int的示例
#include <iostream>
/*
*
* c++ operator的隱式類型轉(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)隱式類型轉(zhuǎn)換,c++中還可以通過(guò)構(gòu)造函數(shù)實(shí)現(xiàn)。
2 構(gòu)造函數(shù)實(shí)現(xiàn)隱式類型轉(zhuǎn)換
在c++ primer一書中提到
可以用單個(gè)實(shí)參來(lái)調(diào)用的構(gòu)造函數(shù)定義了從形參類型到該類類型的一個(gè)轉(zhuǎn)換
看如下示例:
#include <iostream>
/*
*
* c++ 構(gòu)造的隱式類型轉(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)了隱式類型轉(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++語(yǔ)言的博大精深,這篇文章還只是對(duì)隱式轉(zhuǎn)換的入門級(jí)總結(jié)。
參考:
《C++ Primer》隱式類類型轉(zhuǎn)換學(xué)習(xí)整理
以上就是C++中隱式類型轉(zhuǎn)換學(xué)習(xí)筆記的詳細(xì)內(nèi)容,更多關(guān)于C++中隱式類型轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Qt 使用QDialog實(shí)現(xiàn)界面遮罩的示例(蒙版)
界面遮罩在很多時(shí)候都可以用到,例如彈窗,本文主要介紹了Qt 使用QDialog實(shí)現(xiàn)界面遮罩的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
C++課程設(shè)計(jì)之運(yùn)動(dòng)會(huì)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++課程設(shè)計(jì)之運(yùn)動(dòng)會(huì)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
淺析C/C++ 中return *this和return this的區(qū)別
return *this返回的是當(dāng)前對(duì)象的克隆或者本身,return this返回當(dāng)前對(duì)象的地址,下面通過(guò)本文給大家介紹C/C++ 中return *this和return this的區(qū)別,感興趣的朋友一起看看吧2019-10-10

