C++程序员都进来挑战一下
请问下面程序的输出是什么?
class foo2
{
public:
foo2()
{
k = m = 100;
printf( "\n foo2::foo2()\n ");
}
foo2( const foo2& rhs)
{
k = rhs.k;
m = rhs.m;
printf( "\n foo2::foo2() copy constructor, m = %d,k = %d \n ", m, k);
}
foo2& operator=( const foo2& rhs)
{
printf( "\n foo2::operator=\n ");
return *this;
}
int k;
int m;
};
int _tmain(int argc, _TCHAR* argv[])
{
foo2 theFooA = theFooA;
_getch();
return 0;
}
[解决办法]
And your result under using vc?
[解决办法]
这应该属于vc2005的过失呀. 这应该编译不通过, 至少报警的. 这个问题在 exceptional c++ item 38 中也有过描述.
[解决办法]
我想LZ的代码是没有错误的
但是如果在有全局对象
那就会用局部对象为局部对象赋值
而你的意图是用全局对象为局部对象赋值
[解决办法]
对于 int i = i; vs2005 是会报警告的.. 提示你使用前没有初始化i.
但对于类的实例是否初始化,vs2005是没有做判断,因为一般定义类变量theFooA时,会调用默认构造函数foo2()来初始化实例的.
从程序看出,theFooA定义后就直接重载了运算符.从实际结果看,并没有初始化实例.
[解决办法]
从gcc的编译结果来看
Type a = b;和Type a(b);是等价的
这一点是符合常规认知的
所以Type a = a;就是Type a(a);
语法上没有问题
只不过这里当作参数用的a本身没有初始化
语义上可能不是你想要的东西
个人意见:
研究这些奇技淫巧没有什么太大的意义
写出清晰、无歧义的代码才是程序员的职责
[解决办法]
int x=x;
它使x的范围从符号=后开始生效,在Java和Ada中都标记为错。Ada中变量声明中的自引用属非法,Java中自引用被标记为无初始化。
C/C++中全局变量不能这样写,因为它们的初始值必须在编译期确定。对于局部变量,这并不认为是一个错误,它被理解为x的无初始化值的赋值,就是把x位置的值(随机的)赋到x的地方。聪明的编译器应该不会产生这个赋值语句,而仅仅让其名字生效。
类似的还有 int x=x+1;