網站首頁 編程語言 正文
只有接受一個參數(其他參數有默認值的也算)的構造函數才能作為轉換構造函數。
在C++中,接受一個參數的構造函數為將類型與該參數相同的值轉換為類提供了藍圖。因此,下面的構造函數用于將double類型的值轉換為Stonewt類型:
Stonewt(double lbs) // double轉Stonewt的模板
也就是說,可以編寫這樣的代碼:
Stonewt myCat; // 創建一個Stonewt對象 myCat = 19.6; // 使用Stonewt(double)將19.6轉換為Stonewt對象
這一過程稱為隱式轉換,因為它是自動進行的,而不需要顯式強制類型轉換。
將構造函數用作自動類型轉換似乎是一項不錯的特性。然而,當程序員擁有更豐富的C++經驗時,將發現這種自動特性并非總是合乎需要的,因為這會導致意外的類型轉換。因此,C++新增了關鍵字explicit,用于關閉這種自動特性。也就是說,可以這樣聲明構造函數:
explicit Stonewt(double lbs) // 不允許隱式轉換
這將關閉上述示例中介紹的隱式轉換,但仍然允許顯式轉換,即顯式強制類型轉換:
Stonewt myCat; myCat = 19.6; // 不允許,因為Stonewt(double)聲明為explicit myCat = Stonewt(19.6); // OK,一個顯示地轉換 myCat = (Stonewt)19.6; // OK,原始地顯示類型轉換
編譯器在什么時候將使用Stonewt(double)函數呢?
如果在聲明中使用了關鍵字explicit,則Stonewt(double)將只用于顯式強制類型轉換,否則還可以用于下面的隱式轉換:
- 將Stonewt對象初始化為double值時。如:Stonewt st(1.23);
- 將double值賦給Stonewt對象時。如:Stonewt st; st = 1.23;
- 將double值傳遞給接受Stonewt參數的函數時。如:display(Stonewt& st);-> display(1.23);
- 返回值被聲明為Stonewt的函數試圖返回double值時。如:Stonewt& go(){ return 1.23; }
- 在上述任意一種情況下,使用可轉換為double類型的內置類型時。如:Stonewt& go() { return 123; }
可以將數字轉換為Stonewt對象。可以做相反的轉換嗎?也就是說,是否可以將Stonewt對象轉換為double值,就像如下所示的那樣?
Stonewt wolfe(285.7); double host = wolfe;// ??可以嗎??
可以這樣做,但不是使用構造函數。構造函數只用于從某種類型到類類型的轉換。要進行相反的轉換,必須使用特殊的C++運算符函數——轉換函數。
轉換函數是用戶定義的強制類型轉換,可以像使用強制類型轉換那樣使用它們。例如,如果定義了從Stonewt到double的轉換函數,就可以使用下面的轉換:
Stonewt wolfe(285.7); double host = double (wolfe); // syntax #1 double thinker = (double) wolfe; // syntax #2 也可以讓編譯器來決定如何做: Stonewt wells(20, 3); double star = wells; // 隱式使用轉換函數
編譯器發現,右側是Stonewt類型,而左側是double類型,因此它將查看程序員是否定義了與此匹配的轉換函數。(如果沒有找到這樣的定義,編譯器將生成錯誤消息,指出無法將Stonewt賦給double。)
創建一個轉換函數,轉換為typeName類型,需要使用這種形式的轉換函數:
operator?typeName();//?無返回類型,無參數
請注意以下幾點:
- 轉換函數必須是類方法
- 轉換函數不能指定返回類型
- 轉換函數不能有參數
在類的頭文件定義:
operator int() const; operator double() const;
實現代碼:
...... // construct Stonewt object from stone, double values Stonewt::Stonewt(int stn, double lbs) { stone = stn; pds_left = lbs; pounds = stn * Lbs_per_stn + lbs; } ...... // conversion functions Stonewt::operator int() const { return int(pounds + 0.5); } Stonewt::operator double() const { return pounds; }
使用:
Stonewt poppins(9, 2.8);// 9 stone, 2.8 pounds double p_wt = poppins;// implicit conversion cout << "Convert to double => "; cout << "Poppins: " << p_wt << " pounds.\n"; cout << "Convert to int => "; cout << "Poppins: " << int(poppins) << " pounds.\n";
Convert to double => Poppins: 128.8 pounds. Convert to int => Poppins: 129 pounds.
原則上說,最好使用顯式轉換,而避免隱式轉換。在C++98中,關鍵字explicit不能用于轉換函數,但C++11消除了這種限制。因此,在C++11中,可將轉換運算符聲明為顯式的:
class Stonewt { ... // 轉換函數 explicit operator int() const; explicit operator double() const; };
有了explicit聲明后,在顯式強制轉換時才調用這些運算符。
另一種方法是,用一個功能相同的非轉換函數替換該轉換函數即可,但僅在被顯式地調用時,該函數才會執行。也就是說,可以將:
Stonewt::operator int() { return int (pounds + 0.5); } 替換為: int Stonewt::Stone_to_Int() { return int (pounds + 0.5); }
這樣,下面的語句:
int plb = poppins; // 非法 int plb1 = (int) poppins;// 合法 int plb2 = int(poppins);// 合法 int plb3 = poppins.Stone_to_Int(); // 合法
應謹慎地使用隱式轉換函數。通常,最好選擇僅在被顯式地調用時才會執行的函數。
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注AB教程網的更多內容!?
原文鏈接:https://blog.csdn.net/itzyjr/article/details/123448216
相關推薦
- 2022-02-12 安卓給文件賦777讀寫權限
- 2022-07-18 Uniapp中調整web-view的高度、獲取當前的web-view頁面URL
- 2023-09-12 過擬合(over fit)和欠擬合(under fit)
- 2022-04-23 Python實現B站UP主小助手詳解開發流程_python
- 2022-05-06 Python實現提取Excel指定關鍵詞的行數據_python
- 2023-01-17 Linux?ps命令詳解及Linux查看進程的操作方法_linux shell
- 2022-03-12 Android實現流光和光影移動效果代碼_Android
- 2022-09-02 selenium動態數據獲取的方法實現_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支