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

沒有留言:

2024年React state management趨勢

輕量化 在過去Redux 是 React 狀態管理的首選函式庫。 Redux 提供了強大的功能和靈活性,但也帶來了一定的學習成本和複雜度。 隨著 React 生態的不斷發展,越來越多的開發者開始追求輕量化的狀態管理函式庫。 Zustand 和 Recoil 等庫以其簡單易用、性...