2010/04/05

[C++] implicit type conversion

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不知道怎麼處理。

沒有留言:

台灣好行:後慈湖、大溪老街半日遊

要搭台灣好行 慈湖線 (票價100)的朋友,可以在【中壢火車前站】出口,往左邊直走5分鐘到【桃園客運總站】搭乘。搭車到最後一站【慈湖】後可以看到導覽服務站。後慈湖算是管制區,需要先 上網申請 才可以進入,如果是搭台灣好行的話,可以直接在服務站登記候補。假日通常都是人滿為患,建議如...