C++程序员都进来挑战一下

marrco2005 2007-05-08 04:35:19
请问下面程序的输出是什么?
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;
}
...全文
2094 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
p_zyh 2007-05-10
  • 打赏
  • 举报
回复
从gcc的编译结果来看
Type a = b;和Type a(b);是等价的
这一点是符合常规认知的
所以Type a = a;就是Type a(a);
语法上没有问题
只不过这里当作参数用的a本身没有初始化
语义上可能不是你想要的东西

个人意见:
研究这些奇技淫巧没有什么太大的意义
写出清晰、无歧义的代码才是程序员的职责
自由建客 2007-05-10
  • 打赏
  • 举报
回复
我曾在讲程序设计语言原理方面的书上看到的。
自由建客 2007-05-10
  • 打赏
  • 举报
回复
int x=x;
它使x的范围从符号=后开始生效,在Java和Ada中都标记为错。Ada中变量声明中的自引用属非法,Java中自引用被标记为无初始化。
C/C++中全局变量不能这样写,因为它们的初始值必须在编译期确定。对于局部变量,这并不认为是一个错误,它被理解为x的无初始化值的赋值,就是把x位置的值(随机的)赋到x的地方。聪明的编译器应该不会产生这个赋值语句,而仅仅让其名字生效。
类似的还有 int x=x+1;
  • 打赏
  • 举报
回复
还真没见过这种写法
marrco2005 2007-05-10
  • 打赏
  • 举报
回复
楼猪你不仅侮辱我的智商,还侮辱我的人格
这么简单的东西有什么好讨论的?
=======================================
你这样的智商不需要我来侮辱。而且你的人格已经被你自己侮辱了
又是一个只有论点没有论据的家伙
healer_kx 2007-05-09
  • 打赏
  • 举报
回复
直接接分。
tanbo23456 2007-05-09
  • 打赏
  • 举报
回复
楼猪你不仅侮辱我的智商,还侮辱我的人格
这么简单的东西有什么好讨论的?
xingming9 2007-05-09
  • 打赏
  • 举报
回复
对于 int i = i; vs2005 是会报警告的.. 提示你使用前没有初始化i.
但对于类的实例是否初始化,vs2005是没有做判断,因为一般定义类变量theFooA时,会调用默认构造函数foo2()来初始化实例的.
从程序看出,theFooA定义后就直接重载了运算符.从实际结果看,并没有初始化实例.
expter 2007-05-09
  • 打赏
  • 举报
回复
theFooA;

是什麽啊
long_xing 2007-05-09
  • 打赏
  • 举报
回复
foo2& operator=( const foo2& rhs)
{
printf("\n foo2::operator=\n");
return *this;
}

这个没有实现赋值的功能吧
晨星 2007-05-08
  • 打赏
  • 举报
回复
有编译器允许,无非是因为从语法上讲变量一经定义,作用域便已开始,于是即可投入使用。
不过这方面好一点的例子应该是像这样的:
int i = 5, j = i;
像这种
int i = i;
即使你用的编译器一点也不抱怨,也还是不要用了。
Oversense 2007-05-08
  • 打赏
  • 举报
回复
int i = i + 1;
【如鱼饮水】 2007-05-08
  • 打赏
  • 举报
回复
看不懂。
milunhailili 2007-05-08
  • 打赏
  • 举报
回复
看不懂。
changzikun 2007-05-08
  • 打赏
  • 举报
回复
不懂
liujiwei2007 2007-05-08
  • 打赏
  • 举报
回复
我想LZ的代码是没有错误的
但是如果在有全局对象
那就会用局部对象为局部对象赋值
而你的意图是用全局对象为局部对象赋值
marrco2005 2007-05-08
  • 打赏
  • 举报
回复
这应该属于vc2005的过失呀. 这应该编译不通过, 至少报警的. 这个问题在 exceptional c++ item 38 中也有过描述.
=====================================================================
多谢,我去查一下这本书
yutaooo 2007-05-08
  • 打赏
  • 举报
回复
这应该属于vc2005的过失呀. 这应该编译不通过, 至少报警的. 这个问题在 exceptional c++ item 38 中也有过描述.
S_G_D 2007-05-08
  • 打赏
  • 举报
回复
right.
marrco2005 2007-05-08
  • 打赏
  • 举报
回复
foo2::foo2() copy constructor, m = 随机数,k = 随机数
加载更多回复(17)

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧