0

我正在学习 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 的唯一构造函数?

  • 它是属于可以初始化为 Bar 的 Foo 实例的 Bar 大小的内存块吗?

  • 或者是别的什么?

谢谢!

4

4 回答 4

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.

两者xy间接地指代对象。您无法更改x所指的内容(因此必须在实例化时对其进行初始化Foo)。您可以更改y所指的内容。z是一个Bar大小的内存块,位于内部Foo;为了让你像这样合法地声明一个成员变量,你必须把Barbefore的完整定义放好,Foo以便编译器知道有多大Bar

于 2013-02-14T03:17:36.960 回答
1

z是 的一个实例Bar,并且必须在 is 时构造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大小的内存。

于 2013-02-14T03:12:49.773 回答
1
  1. 是的,它是一个 bar:z是 type 的标识符Bar。如果您没有定义默认构造函数,这将生成编译器错误(编译器通常会这样做,但如果您已经定义了至少一个构造 -> 则不会)。
  2. 是的,它是 Bar 大小的内存块,在分配时Foo分配。
于 2013-02-14T03:13:07.323 回答
1

是酒吧吗?如果是这样,如何给它 Bar 的唯一构造函数?

是的,z 是条形。如果Bar没有默认构造函数,则必须Bar在 Foo中初始化member initializers list。下面的示例忽略 x, y 初始化:

Foo::Foo(int param1, int param2, int param3)
: z(param1, param2, param3)
{
}

它是属于可以初始化为 Bar 的 Foo 实例的 Bar 大小的内存块吗?

是的,Bar 对象在 Foo 对象内对齐

于 2013-02-14T03:14:19.430 回答