喜歡的朋友可以關注收藏一下: 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