一个关于对象实例化的小疑点
一个关于对象实例化的小问题
代码很简单
这样运行没什么问题,甚至都不报错(编译器为vc11),如果不使用 圆括号初始化,就会报错 / error C4700: 使用了未初始化的局部变量“bt”/
然后用Gcc4.4也是一样的结果,为什么会这样?<BTest bt>这句不是也已经调用构造函数实例化对象了么? 能详细解释下么?谢谢~~
------解决方案--------------------
首先
Gcc编译就会抛出错误,因为这种操作会产生一个无法访问的临时对象,而 VC 能通过是因为 微软本身对 C++就进行了扩展。你可以试着关掉(/Za)扩展编译就会发现。
其次
在 Gcc 下编译 应该是可以通过的,至于你说编译会报错,检查一下你的编译参数设置。至于合成构造函数它的作用是满足代码的正常编译(不管程序运行后时候会报错),你可以再添加个成员变量调用试试就知道了,至于 show 方法能正常调用,简单说是因为类函数在编译时会被编译为全局函数(只是多了个this),所以获取函数的首地址就可以调用。所以能正常运行就不足为奇了。
代码很简单
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),所以获取函数的首地址就可以调用。所以能正常运行就不足为奇了。