一个对象的C ++构造函数,它是另一个对象的一部分

时间:2015-06-23 17:15:46

标签: c++ constructor

那不是duplicate。请仔细阅读。有两个变量x(类型为int和X),一个成员实际上被声明为private,它在构造函数中使用。它是关于在这个非常具体的案例中理解构造函数的过程。

我正在做C ++课程,我理解下面给出的例子。它是关于构造函数的。

#include <iostream>
using namespace std;

class Element {
    int value;
public:

    Element(int val) {
        value = val;
        cout << "Element(" << val << ") constructed!" << endl;
    }

    int Get(void) {
        return value;
    }

    void Put(int val) {
        value = val;
    }
};

class Collection {
    Element el1, el2;
public:

    Collection(void) : el2(2), el1(1) {
        cout << "Collection constructed!" << endl;
    }

    int Get(int elno) {
        return elno == 1 ? el1.Get() : el2.Get();
    }

    int Put(int elno, int val) {
        if (elno == 1) el1.Put(val);
        else el2.Put(val);
    }
};

int main(void) {
    Collection coll;
    return 0;
}

然后他们提到了以下

  

...   我们还应该补充说,有以下更改   case:当构造函数在声明和声明之间划分时   定义,替代构造函数列表应该关联   与定义,而不是声明。

     

这意味着以下代码段是正确的:

class X {
public:
       X(int x) { };
};

class Y {
       X x;
public:
      Y(int x);
};

Y::Y(int x) : x(1) { };

有人可以解释一下吗?这是真的吗?如果是的话,如何解释? Y有一个单参数构造函数,但没有传递任何值。 x(1)可能是X x中字段Y的构造函数。 1x(1))的值是否会自动传递给Y(int x),尽管它在Y中被声明为私有?

1 个答案:

答案 0 :(得分:1)

在第二个代码片段中,实际上没有构造 - 它只是类和构造函数的定义。关于它的唯一“特殊”的事情是Y的构造函数的主体是在类之外定义的;例如,它可能位于不同的文件中。在这种情况下,将身体直接放入 1 类中没有什么不同:

class Y {
       X x;
public:
      Y(int x) : x(1) {}
};

当调用此Y的构造函数时,它通过将x传递给1构造函数X来构造成员变量intY的构造函数没有做任何其他事情,即它忽略了自己的参数。

原始代码段中使用的语法Y::Y是用于在类定义之外定义成员函数的标准语法。对于非构造函数,它看起来像这样:

class Foo
{
  int bar() const;
};

int Foo::bar() const
{
  return 42;
}

1 稍微不同的是,当直接放入类定义时,该函数是隐式的inline(可以存在于多个翻译单元中)。