2014-09-13 118 views
0
#include<iostream> 
using namespace std; 

class A { 
public: 
    A(int ii = 0) : i(ii) {} 
    void show() { cout << "i = " << i << endl;} 
private: 
    int i; 
}; 

class B { 
public: 
    B(int xx) : x(xx) {} 
    operator A() const { return A(x); } 
private: 
    int x; 
}; 

void g(A a) 
{ a.show(); } 

int main() { 
    B b(10); 
    g(b); 
    g(20); 
    getchar(); 
    return 0; 
} 

一些語法在上面的代碼中任何人都可以解釋什麼是行麻煩的C++

A(int ii = 0) : i(ii) {} 

意思,如何在程序的輸出

i = 10 
i = 20 
+2

假設它是冒號部分你感到困惑,http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-member-syntax-in-the-constructor – chris 2014-09-13 18:19:40

+0

...和如果它是'int ii = 0':http://en.wikipedia.org/wiki/Default_argument – Drop 2014-09-13 18:22:27

+1

C++教程/書的時間[[建議鏈接](http://www.cplusplus.com/doc/tutorial/) )] – 101010 2014-09-13 18:22:39

回答

0

這是聲明的構造到class A

A(int ii = 0) : i(ii) {} 

該部分聲明構造函數可以採用單個int參數,該參數的默認值爲0

A(int ii = 0) 

這部分是初始化成員變量i與從參數ii值。

i(ii) 
0

A(int ii = 0) : i(ii) {}

是類A的構造,它需要一個參數ii,其在初始化列表中,被分配給i。然後它的身體什麼都不做。

等效您有:

A(int ii = 0) : i(ii) { 
// do nothing 
} 

result-你的等效-in方面有:

A(int ii = 0) { 
    i = ii; 
} 
2
A(int ii = 0) : i(ii) {} 

是類一個的構造,並構造具有值ii ,並將i初始化爲ii

輸出

B b(10); 
g(b); 
g(20); 
在此代碼

g(20)是通過類的臨時實例。

,因爲該類的構造並不explicit那麼intB是OK。

+0

對不起,先生,不明白爲什麼g(20)不是錯誤? – iec2011007 2014-09-13 18:29:01

+0

您需要了解C++構造函數。 B'c構造函數的參數是int。所以你傳遞int,比編譯器可以找到B的構造函數。並自動調用B的構造函數。 – Lee 2014-09-13 18:30:11

+0

但A的構造函數也有int作爲參數? – iec2011007 2014-09-13 18:31:45