有一个简单的课程:
class A {
public:
A() {}
void set(int value) { value_ = value; }
private:
int value_;
};
及其全局实例:
A a;
在尚未构造的对象set
上调用方法a
是否可以?例如,当从另一个翻译单元中的另一个全局对象的构造函数调用a.set(123)
时,就会发生这种情况。
稍后当a
的非参数和空构造函数被调用为对象a.set(123)
时,通过调用A
设置的对象a
中的值是否仍然存在
答案 0 :(得分:5)
在尚未构造的对象
a
上调用方法集是否可以?
没有。您可能无法为尚未开始构建的对象调用成员函数。
(由于答案是否,你的第二个问题不需要回答。)
如果您可能需要在动态初始化期间从多个翻译单元访问此全局实例,则可以使用Meyers单例技术:
A& global_a()
{
static A a;
return a;
}
首次调用a
时,将初始化 global_a()
。请注意,在多线程程序中,您可能需要关注synchronization of the initialization.
答案 1 :(得分:2)
写作时
A a;
a
现在是一个构造的对象。如果A
是A
默认构造函数已被调用
答案 2 :(得分:0)
如果在1)你的意思是可以在构造函数中调用set
,那么是的,这很好,因为它不是虚方法。您无法在构造函数中调用虚方法。
至于2),你所问的并不是很清楚。构造函数只被调用一次(尽管有类似的东西,但不要这样做),这就是首次创建对象的时候。你不能再次在a
上调用构造函数,所以这个问题没有意义。