为什么在 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/