关于构造函数的精确调用时机
请看如下示例:
class test{
public:
test(){cout<<"test constructor"<<endl;i=1}
int i;
};
void main(){
test mytest; //#1
cout<<"********"<<endl; //#2
test.i++; //#3
}
《C++ primer》第568页倒数第12行说“C++要求,在类对象首次被使用之前,构造函数将被应用在该对象上”,(本书中其他的地方也有类似的说法)。照这种说法,在上例中,它只保证test的构造函数在#3之前调用就行了,可究竟是在#2之前还是#2之后呢?这将会导致运行的结果有两种:
test constructor
********
或
********
test constructor
虽然我在大多数编译器上测试结果是前者,但《C++ primer》的这种说法未免有点不严格,不像《深度探索C++对象模型》中对此用伪码表示来得精确:
//《深度探索C++对象模型》中的伪码表示
void main(){
test mytest;
mytest.test::test();
cout<<"********"<<endl;
test.i++;
}
这种伪码表示就严格决定了上例中的运行结果是前一种。
也许有人说我未免小题大做、无事生非,但作为一个c++迷,不把一些问题弄清楚行吗?
请高手们对此问题发表点看法!