求一道C++迷惑题目的解答

znchb 2009-12-10 10:04:29

//请问以下的代码输出的c1,c2,c3的结果,
// 恳请给点解释,非常感谢。
//我尝试过编译运行,在编译器通过,在“建立”的时候报错。

#include <iostream>
using namespace std;

int c1=0, c2=0, c3=0;

class A
{
public: A() {c1++;}
A(const A&) {c2++;}
~A() {c3++;}
};

const A foo(const A c)
{
A ab= A(c);
return ab;
}

int main()
{
A a;
A d = foo(a);
cout<<c1<<" "<<c2<<" "<<c3<<endl;
return 0;
}
...全文
275 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
desd003 2009-12-11
  • 打赏
  • 举报
回复
在project->settings->link中将link选项/subsystem:windows删掉或改为/subsystem:console
KingWolfOfSky 2009-12-10
  • 打赏
  • 举报
回复
反汇编了下~~

A a; //c1=1,c2=c3=0,用无参构造器构造
00B916DD lea ecx,[ebp-11h]
00B916E0 call A::A (0B91127h)
00B916E5 mov dword ptr [ebp-4],0
A d = foo(a);
00B916EC push ecx
00B916ED mov ecx,esp
00B916EF mov dword ptr [ebp-0F8h],esp
00B916F5 lea eax,[ebp-11h]
00B916F8 push eax
00B916F9 call A::A (0B911DBh)
00B916FE mov dword ptr [ebp-100h],eax
00B91704 lea ecx,[ebp-1Dh]
00B91707 push ecx
00B91708 call foo (0B91078h)
00B9170D add esp,8
00B91710 mov dword ptr [ebp-104h],eax
00B91716 mov byte ptr [ebp-4],1

KingWolfOfSky 2009-12-10
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
using namespace std;

int c1=0, c2=0, c3=0;

class A
{
public: A() {c1++;}
A(const A&) {c2++;}
~A() {c3++;}
};

const A foo(const A c)
{
A ab= A(c);
return ab;
}

int main()
{
A a; //c1=1,c2=c3=0,用无参构造器构造
A d = foo(a); //c1=1,c2=3,c3=2,先调用A(const A&),返回时c2=1,然后调用foo(const A c),构造ab之后c2=2,返回ab的时候再次调用A(const A&),此时c2=3,最后析构c3=1
cout <<c1 <<" " <<c2 <<" " <<c3 <<endl;
return 0;
}
吾爱豆 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 znchb 的回复:]
--------------------Configuration: question 1 - Win32 Debug--------------------
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/question 1.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

question 1.exe - 1 error(s), 0 warning(s)
[/Quote]

你建的Win32的程序吧~ 应该创建控制台的 win32 console application
程序猿传奇 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cattycat 的回复:]
1,3,2. vc6.0
参加 hairetz的解释。
构造一次,foo参数拷贝一次,里边赋值拷贝一次,返回结果给d赋值拷贝一次,共三次。
析构的是临时变量。
[/Quote]

同结果,顶
chengzhe 2009-12-10
  • 打赏
  • 举报
回复
不优化的化应该是这个结果
znchb 2009-12-10
  • 打赏
  • 举报
回复
谢谢hairetz 和 paulpeath 的解释,我明天看看重新弄个Vc++ 8.0看看行不行
chengzhe 2009-12-10
  • 打赏
  • 举报
回复
我知道了 关键是编译做了很多优化 我自己推算是1 5 4 呵呵
zn88358800 2009-12-10
  • 打赏
  • 举报
回复
我这通过了啊 答案是 1 3 2
LeonTown 2009-12-10
  • 打赏
  • 举报
回复
如果楼主尝试将foo的参数改为引用,
甚至foo的返回值也为引用(但返回局部变量的引用错误),
又会有另外的结果,
会减少几次构造和析构
chengzhe 2009-12-10
  • 打赏
  • 举报
回复
我用g++看是1 2 1 , 用vc是132
cattycat 2009-12-10
  • 打赏
  • 举报
回复
1,3,2. vc6.0
参加 hairetz的解释。
构造一次,foo参数拷贝一次,里边赋值拷贝一次,返回结果给d赋值拷贝一次,共三次。
析构的是临时变量。
paulpeath 2009-12-10
  • 打赏
  • 举报
回复
1 3 2
原因:

int main()
{
A a;//c1=1
A d = foo(a);//函数foo(a)调用时参数a调用复制构造函数A(const A&),使c2=1;函数foo(a)执行时A(c)调用复制构造函数A(const A&),使c2=2;A d = foo(a)调用复制构造函数A(const A&),使c2=3;函数退出时,ab及a销毁,调用析构函数,c3=2.
cout < <c1 < <" " < <c2 < <" " < <c3 < <endl;
return 0;
znchb 2009-12-10
  • 打赏
  • 举报
回复
--------------------Configuration: question 1 - Win32 Debug--------------------
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/question 1.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

question 1.exe - 1 error(s), 0 warning(s)
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 znchb 的回复:]
我用的是 Visual C++ 6.0, 报错
[/Quote]

我这里正常,你报什么错,贴出来。

确实,这个也依赖编译器的优化情况。
znchb 2009-12-10
  • 打赏
  • 举报
回复
我用的是 Visual C++ 6.0, 报错
mstlq 2009-12-10
  • 打赏
  • 举报
回复
这个,不同编译器有不同优化策略……

chengzhe 2009-12-10
  • 打赏
  • 举报
回复
感觉有点不太对, 等我运行下
  • 打赏
  • 举报
回复
我编译通过,解释见注释

class A
{
public: A() {c1++;}
A(const A&) {c2++;}
~A() {c3++;}
};

const A foo(const A c) //传参一次拷贝构造 c2++
{
A ab= A(c); //赋值一次c2++
return ab;
}

int main()
{
A a; //执行一次普通构造 c1=1
A d = foo(a); //结果返回再一次c2++
cout <<c1 <<" " <<c2 <<" " <<c3 <<endl; //在return 0之前,只有函数foo里的c跟ab2个临时变量被析构,c3=2
return 0;
}




结果是1 3 2
znchb 2009-12-10
  • 打赏
  • 举报
回复
能不能给点解释呢?
谢谢
加载更多回复(7)

64,666

社区成员

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

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