關於轉換構造函數與轉換函數_第二門課_第一週

喜歡的朋友可以關注收藏一下:  http://blog.csdn.NET/qq_31201973

本文如有錯誤,請及時私信我。

本文解釋了轉換構造函數與轉換函數一起可能出現的歧義問題

這段代碼是Fraction類型和int類型相加,因爲沒有對應的加法,但是有double轉換函數,又因爲有double的加運算符,所以轉換。

C++中的explicit
C++提供了關鍵字explicit,可以阻止不應該允許的經過轉換構造函數進行的隱式轉換的發生。聲明爲explicit的構造函數不能在隱式轉換中使用。
C++中, 一個參數的構造函數(或者除了第一個參數外其餘參數都有默認值的多參構造函數), 承擔了兩個角色。 1 是個構造器 2 是個默認且隱含的類型轉換操作符。
所以, 有時候在我們寫下如 AAA = XXX, 這樣的代碼, 且恰好XXX的類型正好是AAA單參數構造器的參數類型, 這時候編譯器就自動調用這個構造器, 創建一個AAA的對象。

而這段代碼同樣是Fraction類型和double類型相加,又因爲有+運算符重載,而它接受的右值是const Fraction& f,會做一個隱式轉換,調用構造轉換函數,構造一個Fraction。

而這個同樣是Fraction類型+double類型,因爲既可以 + 和 轉換構造的匹配,又可以double()轉換後相加,產生了二義。

下面我放了三段我的測試代碼:

 

#include <iostream>  

using namespace std;

class Complex
{
public:
//Complex() :real(0), imag(0){};
Complex(double r, double i) :real(r), imag(i){};
Complex(double r) :real(r), imag(0){};  // 定義轉換構造函數  


operator double(){ // 定義類型轉換函數  
cout << "dfsfa00" << endl;
return real;
}
//private:
double real;
double imag;
};

ostream& operator <<(ostream& os, Complex& a){
return os << "real = " << a.real << " image = " << a.imag << endl;
}

int main(int argc, char* argv[])
{
Complex c1(1.2, 2.3);
Complex c2(0, 0);
double d;
c2 = c1 + 1.1; // 調用類型轉換函數將c1轉換爲double  
cout << c2 << endl;
getchar();
return 0;
}

 

 

#include <iostream>  

using namespace std;

class Complex
{
public:
//Complex() :real(0), imag(0){};
Complex(double r, double i) :real(r), imag(i){};
Complex(double r) :real(r), imag(0){};  // 定義轉換構造函數  

void Print(){
cout << "real = " << real << " image = " << imag << endl;
}
operator double(){ // 定義類型轉換函數  
cout << "dfsfa00" << endl;
return real;
}
private:
double real;
double imag;
};

int main(int argc, char* argv[])
{
Complex c1(1.2, 2.3);
Complex c2(0, 0);
double d;
c2 = c1 + 1.1; // 調用類型轉換函數將c1轉換爲double  
cout << c2 << endl;
getchar();
return 0;
}


 

 

#include <iostream>  

using namespace std;

class Complex
{
public:
//Complex() :real(0), imag(0){};
Complex(double r, double i) :real(r), imag(i){};
Complex(double r) :real(r), imag(0){};  // 定義轉換構造函數  

void Print(){
cout << "real = " << real << " image = " << imag << endl;
}
operator double(){ // 定義類型轉換函數  
cout << "dfsfa00" << endl;
return real;
}
private:
double real;
double imag;
};

int main(int argc, char* argv[])
{
Complex c1(1.2, 2.3);
double d;
d = c1 + 1.1; // 調用類型轉換函數將c1轉換爲double  
cout << d << endl;
getchar();
return 0;
}

 

第一個是因爲重載<<

第二個是沒有重載<<,轉換了兩次

第三個是double

參考資料:

1. http://www.2cto.com/kf/201311/258753.html

2. http://baike.so.com/doc/6949532-7171933.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章