那不是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
的构造函数。 1
(x(1)
)的值是否会自动传递给Y(int x)
,尽管它在Y
中被声明为私有?
答案 0 :(得分:1)
在第二个代码片段中,实际上没有构造 - 它只是类和构造函数的定义。关于它的唯一“特殊”的事情是Y
的构造函数的主体是在类之外定义的;例如,它可能位于不同的文件中。在这种情况下,将身体直接放入 1 类中没有什么不同:
class Y {
X x;
public:
Y(int x) : x(1) {}
};
当调用此Y
的构造函数时,它通过将x
传递给1
构造函数X
来构造成员变量int
。 Y
的构造函数没有做任何其他事情,即它忽略了自己的参数。
原始代码段中使用的语法Y::Y
是用于在类定义之外定义成员函数的标准语法。对于非构造函数,它看起来像这样:
class Foo
{
int bar() const;
};
int Foo::bar() const
{
return 42;
}
1 稍微不同的是,当直接放入类定义时,该函数是隐式的inline
(可以存在于多个翻译单元中)。