一个关于对象实例化的小疑点

一个关于对象实例化的小问题
本帖最后由 xiaoz17 于 2013-01-09 01:21:13 编辑
代码很简单

class ATest
{
public:
    void show(){ cout << "show" << endl; };
};

class BTest
{
public:
   ATest *a;
};

int _tmain(int argc, _TCHAR* argv[])
{
    BTest *bt = &BTest();  // 重点
    bt->a->show();  

    BTest bt2 = BTest();  // 重点
    (*( bt2.a ) ).show();

};


这样运行没什么问题,甚至都不报错(编译器为vc11),如果不使用 圆括号初始化,就会报错 / error C4700: 使用了未初始化的局部变量“bt”/


int _tmain(int argc, _TCHAR* argv[])
{
    BTest bt; 
    (*(bt.a) ).show();

};


然后用Gcc4.4也是一样的结果,为什么会这样?<BTest bt>这句不是也已经调用构造函数实例化对象了么? 能详细解释下么?谢谢~~

------解决方案--------------------
首先

BTest *bt = &BTest();
  
Gcc编译就会抛出错误,因为这种操作会产生一个无法访问的临时对象,而 VC 能通过是因为 微软本身对 C++就进行了扩展。你可以试着关掉(/Za)扩展编译就会发现。

其次 

BTest bt2 = BTest(); // 第一种
BTest bt3;  // 第二种

在 Gcc 下编译 应该是可以通过的,至于你说编译会报错,检查一下你的编译参数设置。至于合成构造函数它的作用是满足代码的正常编译(不管程序运行后时候会报错),你可以再添加个成员变量调用试试就知道了,至于 show 方法能正常调用,简单说是因为类函数在编译时会被编译为全局函数(只是多了个this),所以获取函数的首地址就可以调用。所以能正常运行就不足为奇了。