我正在学习C ++(来自Java),这让我感到很痛苦,说我有......
class Foo {
public:
Bar &x; // <- This is a ref, Bar is not instantiated (this is just a placeholder)
Bar *y; // <- This is a pointer, Bar is not instantiated (this is just another placeholder)
Bar z; // <- What is this???
};
class Bar {
public:
Bar(int bunchOfCrap, int thatNeedsToBeHere, double toMakeABar);
};
在这个示例中,Bar有一个构造函数需要指定一堆字段才能创建“Bar”。无论是x还是y都没有创建Bar,我理解x创建了一个可以指向Bar的引用,并且y创建了一个也可以表示Bar的指针。
我不明白的是z到底是什么。
这是酒吧吗?如果是这样,怎么能给Bar唯一的构造函数呢?
是否属于Foo实例的Bar大小的内存块可以初始化为Bar?
还是别的什么?
谢谢!
答案 0 :(得分:3)
出于教学原因,让我们尝试编译这段代码:
class Bar {
public:
Bar(int bunchOfCrap, int thatNeedsToBeHere, double toMakeABar);
};
class Foo {
public:
Bar &x; // <- This is a ref, Bar is not instantiated (this is just a placeholder)
Bar *y; // <- This is a pointer, Bar is not instantiated (this is just a *safer* placeholder)
Bar z; // <- What is this???
};
int main() {
Foo foo;
}
输出:
c++ uuu.cpp -o uuu
uuu.cpp:10:7: error: implicit default constructor for 'Foo' must explicitly initialize the reference member 'x'
class Foo {
^
uuu.cpp:14:10: note: declared here
Bar &x; // <- This is a ref, Bar is not instantiated (this is just a placeholder)
^
uuu.cpp:10:7: error: implicit default constructor for 'Foo' must explicitly initialize the member 'z' which does not
have a default constructor
class Foo {
^
uuu.cpp:16:9: note: member is declared here
Bar z; // <- What is this???
^
uuu.cpp:2:7: note: 'Bar' declared here
class Bar {
^
uuu.cpp:21:9: note: implicit default constructor for 'Foo' first required here
Foo foo;
^
2 errors generated.
make: *** [uuu] Error 1
正如它所说,必须初始化成员引用Bar &x
和成员变量Bar z;
,因为Bar
没有默认构造函数。 y
不必初始化,默认为NULL
。
x
和y
都间接引用该对象。您无法更改x
引用的内容(因此必须在实例化Foo
时对其进行初始化)。您可以更改y
所指的内容。 z
是一个Bar
大小的内存块,位于Foo
内;为了合法地声明这样的成员变量,你必须在Bar
之前放置Foo
的完整定义,以便编译器知道Bar
有多大。
答案 1 :(得分:1)
z
是Bar
的一个实例,必须在Foo
时构建,因此:
class Foo {
public:
Foo(…)
: x(<instance of or reference to Bar>),
y(<pointer to Bar>), // optional
z(<Bar ctor params>)
{ … }
请注意,x
和z
必须在构建期间初始化,而忽略y
的初始化是合法的(尽管有问题)。
z
占用与父Foo
实例相同的内存,但它是Bar
的实例,而不仅仅是Bar
大小的内存块。
答案 2 :(得分:1)
z
是值类型为Bar
的标识符。如果你没有定义默认构造函数,这将产生一个编译器错误(编译器通常会这样做,但如果你已经定义了至少一个构造,那就不会这样做了 - >你有的那个)。Foo
时分配。答案 3 :(得分:1)
这是酒吧吗?如果是这样,那么如何才能给出Bar唯一的构造函数呢?
是的,z是一个酒吧。如果Bar
没有默认构造函数,则必须在Foo Bar
中初始化member initializers list
。下面的示例忽略x,y初始化:
Foo::Foo(int param1, int param2, int param3)
: z(param1, param2, param3)
{
}
是否属于Foo实例的Bar大小的内存块可以初始化为Bar?
是的,Bar对象在Foo对象
中对齐