Case1: implicit type conversion in normal function |
#include <iostream> #include <string> using namespace std; /* string Constructor explicit string ( ); string ( const string& str ); string ( const string& str, size_t pos, size_t n = npos ); string ( const char * s, size_t n ); string ( const char * s ); string ( size_t n, char c ); template<class InputIterator> string (InputIterator begin, InputIterator end); */ void foo(string s) { cout << s; } int main() { char s[] = "1234"; foo(s); return 0; } |
上面的例子中,我們在main裡面宣告依個char s[],再把此array的pointer s傳到
void foo(string s),但是問題來了,因為foo的參數式string s,但是main傳入的是char * s,型態不同怎可以傳遞呢?
這是因為main的char * s在傳給foo的string s會呼叫其建構子
string ( const char * s );
因此char * s當作參數傳給string的建構子,初始化此物件後就成為foo的 string s。
Case2: implicit type conversion in constructor |
#include <iostream> #include <string> using namespace std; class ClassName { private: int x; public: ClassName(int x){this->x = x;} }; int main() { int n=3; ClassName a(1); ClassName b(2); a = b; // ok. a = n; // ok. n = a; // error } |
同樣的情況,在作物件本身的assignment(=)時也會出現同樣的情況。
1.
a = b;
左邊的type為ClassName,右邊的type為ClassName,所以沒問題。a裡的所有變數都會成跟b一樣,也就是a的x等於2。
2.
a = n;
左邊的type為ClassName,右邊的type為int,這是時候系統就會使用Implicit type conversion in constructor。3會傳到建構子ClassName(3),所以a裡的x等於3。
3.
n = a;
左邊的type為int,右邊的type為ClassName。由於int沒有其他constructor可以轉換其他物件。所以右邊的ClassName造成int不知道怎麼處理。