A a; 和 A a=A();有没有区别.

wd_6532 2006-01-24 03:41:25
class A
{
public:
A()
{
cout<<"基类默认构造函数"<<endl ;
};

A(int i)
{
cout<<"基类参数构造"<<endl;
};

int m_i;
};
...全文
752 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxxdg 2006-02-04
  • 打赏
  • 举报
回复
一般情况下,
似乎 Type t[]={Type(value),Type(value)};
这种形式更有意义点
ox_thedarkness 2006-01-30
  • 打赏
  • 举报
回复
答案是,按C++标准,没有区别。

但是某些老编译器,如VC6就不符合标准。

目前的主流编译器如 VC7\ GCC\ DEVC++ 等都符合标准(BCB我没装,应该也符合标准)。
wd_6532 2006-01-30
  • 打赏
  • 举报
回复
有没有定论?

可否结贴?
LYH_Studio 2006-01-29
  • 打赏
  • 举报
回复
啊。。。
我不明白为什么
//set<int> por(std::istream_iterator<int>(cin), std::istream_iterator<int>());
//这的确是个函数声明。要让por变成set<int>的实例,那么就
//set<int> por((std::istream_iterator<int>(cin)), std::istream_iterator<int>());
//这样 编译器就知道程序员想让por是什么了

我不明白为什么第一种写法是一个函数声明,而第二个就不是呢,它们只差一个括号喔。
????
疑惑啊。
Muf 2006-01-29
  • 打赏
  • 举报
回复
VC2003
ox_thedarkness 2006-01-28
  • 打赏
  • 举报
回复
不要用vc6.0 那个冬冬非常不符合C++标准

推荐使用vc7.0/ dev C++
arbeisi210 2006-01-28
  • 打赏
  • 举报
回复
ding............


【华为/慧通 C、C++、VC、Java 程序员招聘】

详见: http://community.csdn.net/Expert/topic/4536/4536791.xml?temp=.0224573
force2004 2006-01-28
  • 打赏
  • 举报
回复
楼上的代码我也测试了,在xp系统vc6.0下测试:

输出如下:
默认构造函数
----------------
默认构造函数
拷贝构造函数
----------------
默认构造函数
拷贝构造函数
----------------

希望:Muf(沐枫)能说一下你的测试环境!
希望:rigel2001(大宝)能解释一下何为编译器不标准?对于语句A b(A())c++标准里有要求要如何操作还是这个和编译器紧密相关?
wd_6532 2006-01-27
  • 打赏
  • 举报
回复


cpyclass a=cpyclass();

这一句,需要在Release模式下,才能见到其威力的。:)

=================
嘛意思?
rigel2001 2006-01-27
  • 打赏
  • 举报
回复
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
没有用到copy constructor,这点是可以肯定的,哪个编译器都不会用到。

A a;

等价于

A a( A() );

等价于

A a = A();

说用到copy ctor的人,只是从代码形式上进行的推测而已,实际上,没有临时对象。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Muf 2006-01-27
  • 打赏
  • 举报
回复
rigel2001(大宝) 说的不错。我特地测试了一下,证实了你的说法。谢谢。

#include <stdio.h>

class A{
int v;
public:
A():v(0){printf("默认构造函数\n");}
A(const A& a):v(a.v+1){printf("拷贝构造函数\n");}
};

void main()
{
A a;
printf("------------------\n");
A b((A()));
printf("------------------\n");
A c = A();
}

输出:
默认构造函数
------------------
默认构造函数
------------------
默认构造函数
rigel2001 2006-01-27
  • 打赏
  • 举报
回复
居然说: A a; 等价于 A a( A() );
????

严重保留意见。
------------------------
我说
A a; 等价于 A a( A() );
是指二者语义上等价,不是语法,我想说明的是无论形式如何,拷贝构造函数是不会被调用的.



class A{
int v;
public:
A():v(0){}
A(const A& a):v(a.v+1){}
};

那么A a; 还等价于A a(A());吗?
------------------------------
拷贝构造函数不会被调用,即使v(a.v+100000),二者在语义上仍然等价.



force2004(牛牛)
------------------------------
你的编译器不标准

ox_thedarkness 2006-01-27
  • 打赏
  • 举报
回复
楼上的请不要用vc6,改用vc7或者devc++测试。
Muf 2006-01-27
  • 打赏
  • 举报
回复
意思就是,在release下,
cpyclass a;
cpyclass a=cpyclass();
是完全等价的。C++在编译时,它会将临时对象优化掉。这种优化是必须的,目的就是为了避免许多C++函数的效率降低。
force2004 2006-01-27
  • 打赏
  • 举报
回复
看完以上内容以及在vc下测试,结果就是Muf(沐枫) 和 hejian29(水手啦)的一致。rigel2001(大宝) 的说法很有问题,希望他也能测试一下。也总结一下吧:
A a; //调用构造函数
A a = A(); //调用构造函数和copy构造函数;(前提是A要提供copy构造函数)
————————————————————————————————
A a; //调用构造函数
a = A(); //调用构造函数和operator=操作符(前提是A提供operator=)

有人对 A a = A() 提出编译器会优化,但是在A提供copy构造函数的时候,无论是在debug还是release下都依然会调用A的copy构造函数。
Muf 2006-01-27
  • 打赏
  • 举报
回复
class A{
int v;
public:
A():v(0){}
A(const A& a):v(a.v+1){}
};

那么A a; 还等价于A a(A());吗?
Muf 2006-01-27
  • 打赏
  • 举报
回复
居然说: A a; 等价于 A a( A() );
????

严重保留意见。
Kid4you 2006-01-27
  • 打赏
  • 举报
回复
只要类的构造函数写的好,就根据需要选择了
samz2006 2006-01-27
  • 打赏
  • 举报
回复
up
Jinhao 2006-01-25
  • 打赏
  • 举报
回复
A a=A();
标准说了,A()这个临时对象会被优化掉。

set<int> por(std::istream_iterator<int>(cin), std::istream_iterator<int>());
这的确是个函数声明。要让por变成set<int>的实例,那么就
set<int> por((std::istream_iterator<int>(cin)), std::istream_iterator<int>());
这样 编译器就知道程序员想让por是什么了
加载更多回复(22)

64,318

社区成员

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

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