C ++构造函数Oder [关闭]

Posted

技术标签:

【中文标题】C ++构造函数Oder [关闭]【英文标题】:C++ Constructor Oder [closed] 【发布时间】:2016-08-30 13:55:36 【问题描述】:

考虑以下代码:

#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

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

【问题讨论】:

请使用一致的名称和值! cls1 应该打印 c1 和 d1。 不确定您的逻辑,但您的命名约定有缺陷。我发现 cls2 打印 c3cls1 打印 c2 令人困惑。 您能否让演示文稿不那么迟钝和莫名其妙? x 成员或构造函数参数是否有关联? @tobi303,我稍微编辑了一下,希望现在更好 【参考方案1】:

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

class cls1

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

首先创建那个。

否则,您的预期订单是正确的。

【讨论】:

对,我没注意到c,谢谢指出。 顺便说一句,以这种方式声明变量在 C++ 中非常晦涩难懂。我认为我从未见过任何生产/专业代码以这种方式声明变量(在类定义之后)。

以上是关于C ++构造函数Oder [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C ++派生类构造函数[关闭]

C ++ 0x移动构造函数陷阱[关闭]

C ++复制构造函数中的异常[关闭]

运行时的C ++构造函数变量值不会被覆盖[关闭]

如何为父类构造函数提供值,其中父构造函数的参数多于c#中static static main的子类; [关闭]

用成员函数c ++覆盖成员数据[关闭]