2014-09-13 126 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