C++中的转换构造函数和类型转换函数
生活随笔
收集整理的這篇文章主要介紹了
C++中的转换构造函数和类型转换函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1 C++中的轉換構造函數
- 1.1 轉換構造函數
- 1.2 explicit關鍵字
- 2 C++中的類型轉換函數
- 2.1 類型轉換函數
- 3 轉換構造函數與類型轉換函數之間的沖突
- 3.1 轉換構造函數與類型轉換函數之間的沖突
- 3.2 解決方案
1 C++中的轉換構造函數
1.1 轉換構造函數
我們知道構造函數可以定義不同類型的參數,參數滿足下列條件時稱為轉換構造函數:
- 有且僅有一個參數。
- 參數是基本類型。
- 參數是其它類類型。
看如下代碼:
編譯器盡力嘗試的結果是隱式類型轉換,隱式類型轉換:
- 會讓程序以意想不到的方式進行工作。
- 是工程中bug的重要來源。
1.2 explicit關鍵字
explicit關鍵字:
- 工程中通過explicit關鍵字杜絕編譯器的轉換嘗試。
- 轉換構造函數被explicit修飾時只能進行顯示轉換。
普通類型到類類型示例代碼:
2 C++中的類型轉換函數
2.1 類型轉換函數
為了實現類類型到普通類型之間的轉換,我們需要引入類型轉換函數。
類型轉換函數:
- C++類中可以定義類型轉換函數。
- 類型轉換函數用于將類對象轉換為其他類型。
類型轉換函數:
- 與轉換構造函數具有同等的地位。
- 使得編譯器有能力將對象轉換為其他類型。
- 編譯器能夠隱式的使用類型轉換函數。
類類型到普通類型之間的轉換:
#include <iostream> #include <string>using namespace std;class Test {int mValue; public:Test(int i = 0){mValue = i;}int value(){return mValue;}operator int (){return mValue;} };int main() { Test t(100);int i = t;cout << "t.value() = " << t.value() << endl;cout << "i = " << i << endl;return 0; }3 轉換構造函數與類型轉換函數之間的沖突
3.1 轉換構造函數與類型轉換函數之間的沖突
#include <iostream> #include <string>using namespace std;class Test;class Value { public:Value(){}explicit Value(Test& t){} };class Test {int mValue; public:Test(int i = 0){mValue = i;}int value(){return mValue;}operator Value(){Value ret;cout << "operator Value()" << endl;return ret;} };int main() { Test t(100);Value v = t; // 編譯error,轉換構造函數和類型轉換函數都可以完成,編譯器不知道選擇哪一個函數,我們可以將轉換構造函數前加上explicit關鍵字return 0; }3.2 解決方案
轉換構造函數與類型轉換函數:
- 無法抑制隱式的類型轉換函數調用。
- 類型轉換函數可能與轉換構造函數沖突。
- 工程中以Type toType()的公有成員代替類型轉換函數。
qt中的解決方案:
#include <QDebug> #include <QString>int main() {QString str = "";int i = 0;double d = 0;short s = 0;str = "-255";i = str.toInt();d = str.toDouble();s = str.toShort();qDebug() << "i = " << i << endl;qDebug() << "d = " << d << endl;qDebug() << "s = " << s << endl;return 0; }參考資料:
總結
以上是生活随笔為你收集整理的C++中的转换构造函数和类型转换函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全国各地都有哪些好吃的烧烤?
- 下一篇: C++中继承的基本概念