藏經閣

一切有為法,如夢幻泡影,如露亦如電,應作如是觀。

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

如何在Blogger新增隨機文章

Blogger Hack - How to add a Random Post Gadget in Blogger)

 


0 意見

張貼留言