高手帮忙:看一段代码,很简单但很奇怪

wuya 2003-05-06 11:17:27
#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

class MyClass{
public:
MyClass(){
cout << "begin" << endl;
}

~MyClass(){
cout << "end" << endl;
}
};

int main (int argc, char *argv[])
{
MyClass MyObj(); // N1
return(0);
}

注意N1部分的定义,结果令人意外。
请问N1部分在干什么?
...全文
21 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lifanxi 2003-05-07
  • 打赏
  • 举报
回复
呵呵,我好像回复的太晚了~~~~~~~
lifanxi 2003-05-07
  • 打赏
  • 举报
回复
呵呵,chinajiji跟我学会开玩笑了,我曾两次批评chinajiji抢在我前面乱说:)
真的是打错了,谢谢chinajiji指正!不过那个“而且...”好像是废话,我说两个语意相同当然是在可以编译的前提下,如果没有default constructor两个句子都不能通过编译呀。
改过的程序怎么了?在VC6下不能编译,因为那个函数定义里没有返回值。
Dev下倒可以编译,而且从结果来看,还有点奇怪,我再研究研究。


chinajiji 2003-05-06
  • 打赏
  • 举报
回复
wuya(乌鸦):
我那是在和lifanxi(Byron) 先生开玩笑,他对我以前的回贴都看得很仔细,帮我挑出不少的毛病,我一直都没机会感谢他,今天算是对他的一个小小的回报吧.
你说:
MyClass MyObj(); // N1
MyObj(); //这里还是要调用函数MyObj的.
return(0);

你的函数:
MyClass MyObj(){
cout << "ttt" << endl;
}
应该有个返回值.如果这样:
MyClass MyObj(){
cout << "ttt" << endl;
return MyClass();
}
将调用函数MyObj后,返回一个MyClass类型的临时对象,将调用MyClass::MyClass()和MyClass::~MyClass();
如果没有return MyClass();这一句,
在VC6.0中将出编译错,DEV-Cpp与C++ builder没有编译错,可运行,但不调用MyClass::MyClass();仅调用:MyClass::~MyClass();
wuya 2003-05-06
  • 打赏
  • 举报
回复
不好意思,刚开始的表达有误。

代码应该是下面所示的。

#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

class MyClass{
public:
MyClass(){
cout << "begin" << endl;
}

~MyClass(){
cout << "end" << endl;
}
};

int main (int argc, char *argv[])
{
MyClass(); // N1
return(0);
}


注意N1部分的定义,结果令人意外。
请问N1部分在干什么?
编译是可以通过的。
wuya 2003-05-06
  • 打赏
  • 举报
回复
楼上所言,我想大家都是知道的了,笔误了。
chinajiji 2003-05-06
  • 打赏
  • 举报
回复
唉,没想到我崇敬的 lifanxi(Byron) 先生又在我后面乱说!

不过要注意:
MyClass * p = new MyObj();//错!应该是MyClass * p = new MyClass()
而且仅当MyClass存在default constructor时才能这样做,
否则应当在括号里加上初始化参数.

MyClass * p = new MyObj;//错!应为:MyClass * p = new MyClass;
语义是一样的。
wuya 2003-05-06
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <iostream>
#include <string>

using namespace std;

class MyClass{
public:
MyClass(){
cout << "begin" << endl;
}

~MyClass(){
cout << "end" << endl;
}
};

int main (int argc, char *argv[])
{
MyClass MyObj(); // N1
MyObj();
return(0);
}


MyClass MyObj(){
cout << "ttt" << endl;
}

你认为结果又是怎么样的呢?
我觉得,可能没各位想的那么简单。
lifanxi 2003-05-06
  • 打赏
  • 举报
回复
请分清
MyClass MyObj();

MyClass MyObj;
的区别。
前者是声明一个了个名为MyObj的函数,它的返回值是MyClass型的。
后者是定义一个MyClas型的对象MyObj;
不过要注意:
MyClass * p = new MyObj();

MyClass * p = new MyObj;
语义是一样的。
chinajiji 2003-05-06
  • 打赏
  • 举报
回复
MyClass MyObj();
声明了一个MyObj函数,返回值是MyClass;
运行结果就是什么也没做.

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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