2016-08-30 78 views
-2

考虑下面的代码段:C++构造奥德

#include<iostream> 
using namespace std; 
class cls 
{ 
public: 
     cls(int i=0) {cout<<" c1 ";} 
     ~cls() {cout<<" d 1 ";} 
}; 
class cls2 
{ 
cls xx; 
public: 
     cls1(int i=0){cout<<" c2 ";} 
     ~cls1(){cout<<" d2 ";} 
}c; 
class cls3 
{ 
    cls2 xx; cls xxx; 
public: 
    cls2(int i=0) {cout<<" c3 ";} 
    ~cls2(){ cout<<" d3 ";} 
}; 
int main() 
{ 
    cls3 s; 
    return 0; 
} 

现在,当我运行它,它输出:

C1 C2 C1 C2 C1 C3 D3 D1 D2 D1 D2 D1

,我似乎无法找出为什么,在我的头上,它应该输出:

C1,C2,C1〜C3均D3 D1 D2 D1

因为:

cls2 s -> cls1 xx -> cls xx => c1 
          => c2 
       -> cls xxx => c1 
       => c3 

我知道的地方,我的逻辑是有缺陷的,但我不知道在哪里。

+5

请使用一致的名称和值! cls1应该打印c1和d1。 – vz0

+0

不确定你的逻辑,但你的命名约定是有缺陷的。我发现混淆了'cls2'打印'c3',而'cls1'打印'c2'。 – user463035818

+1

您能否让演示文稿不那么呆板和莫名其妙? –

回答

9

您在这里创建一个额外的全局实例c

class cls1 
{ 
    int x; cls xx; 
public: 
     cls1(int i=0){cout<<" c2 ";x=i;} 
     ~cls1(){cout<<" d2 ";} 
} c; // <-- here 

,一个是第一次创建。

否则您的预期订单是专色。

+0

没错,我没有注意到c,谢谢指出。 –

+0

顺便说一句,以这种方式声明变量在C++中是非常隐晦的。我不认为我曾经见过任何生产/专业代码以这种方式写出了声明变量(在类定义之后)。 – PaulMcKenzie