首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++程序员都进来挑战一下,该如何处理

2012-02-05 
C++程序员都进来挑战一下请问下面程序的输出是什么?classfoo2{public:foo2(){km100printf( \nfoo2::fo

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;

热点排行