c++ - 指向类中对象的指针,C++ 新手问题

标签 c++ class pointers oop

为什么在 C++ 中,对于对象 A、B

//interface, case #1
class A {

B bb;
}

A::A()
{ //constructor
bb = B();
}


//interface, case #2
class A {

B *bb;
}

A::A()
{ //constructor
bb = new B();
}

为什么案例 #2 有效但案例 #1 无效??

编辑:我现在明白了。但是对于案例 #1,如果 A 的一个实例被释放,它的 bb 是否也会被自动释放?案例 #2 你必须显式调用 bb = NULL 对吗?

最佳答案

两者都有语法错误,因此“不起作用”并不特定于其中一个。您还没有声明 A::A 构造函数,因此当您尝试定义它时会遇到语义错误。

如果 B 的完整声明在类 A 的声明之前可用,那么它将编译:

class B {};

//interface
class A {
    A();

    B bb;
};

A::A()
{ //constructor
    bb = B();
}

bb=B() 行中,bb 已经被构建,因为它是 A 的成员。然后您将构建另一个 B,然后将该 B 的值复制到 bb。这有点浪费。如果您想将参数传递给 bb 的构造函数,请使用初始化器。

另一方面,如果您不想将 B 的定义放在 A 的定义之前,并且只有对它的前向引用,则编译器无法计算出 B 对象有多大.它需要知道 B 有多大才能确定 A 中的 bb 有多少空间。因此它无法编译没有 B 的 A。

在第二种情况下,您改为使用指向 B 的指针。无论指针指向什么,它们的大小都相同。这样编译器就可以计算出 A 有多大,并且在实际使用之前只需要 B 的完整声明,例如通过在 new B() 表达式中调用 B 的构造函数。

关于c++ - 指向类中对象的指针,C++ 新手问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/653423/

相关文章:

c++ - 如何将数组的内容附加到 std::vector ?

java - 成绩簿 Java 程序。帮忙打电话上课吗?

css - SVG 路径的亮度不适用于 Chrome 但在 Firefox 中

c - printf ("%s\n",str);给出段错误但 printf ("%s",str);不要,其中 "str"是一个字符串指针

c++ - DirectX:如何为圆锥体初始化顶点缓冲区和索引缓冲区?

c++ - 创建返回 std::pair 的 C++ 容器的迭代器

java - 将类作为方法中的参数传递并在 If 语句中使用此参数

C++ 属性声明

memory - 创建指向特定位置的指针

c++ - 模板变量作为 unordered_map 键,迭代器问题