白痴问题:原来构造函数可以直接调用的?

jorge 2004-08-28 05:16:04
一个类:
class SomeClass
{
public:
SomeClass(int x);
};

在类之外居然可以这样写:

SomeClass s=SomeClass(100);

说来惭愧,还是俺MM玩C++时发现的,和我说,我说这怎么可能呢,一试验,我那个糗啊……
怪本人学艺不精,还望大侠指点,这种语法代表什么,有什么用处呢?
...全文
550 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
whyglinux 2004-08-28
  • 打赏
  • 举报
回复
>> SomeClass *ps=&SomeClass(100);
>> 会形成悬挂指针么?

不错,会形成悬挂指针,即“野指针”。因为这个临时对象的生存期间很短,其所在的语句结束,临时对象就消失了。

如果想延长这个临时对象的生存期,有一种方法是对它进行const引用,即

const SomeClass& pr = SomeClass(100);

这样,只要 pr 存在,SomeClass(100)这个临时对象就存在。
积木 2004-08-28
  • 打赏
  • 举报
回复
哥们改一个名字吧,你不是有mm吗?
jorge 2004-08-28
  • 打赏
  • 举报
回复
呵呵~~~
谢了!
积木 2004-08-28
  • 打赏
  • 举报
回复
main.cpp
main.cpp: In function `int main()':
main.cpp:9: warning: taking address of temporary
main.cpp:11:2: warning: no newline at end of file

main.o - 0 error(s), 2 warning(s)

刚才我写错代码了,所以没有编过^_^

我们看到了两个warning,第一个就是我们说的那个。

是啊,这样的确造成了悬挂指针。
jorge 2004-08-28
  • 打赏
  • 举报
回复
确实通过了呀!

环境是 VS.net 2002

按标准应该通不过么?
积木 2004-08-28
  • 打赏
  • 举报
回复
放心,这么编译干脆不通过
jorge 2004-08-28
  • 打赏
  • 举报
回复
谢!~~~

若是临时对象的话,若写
SomeClass *ps=&SomeClass(100);
会形成悬挂指针么?
积木 2004-08-28
  • 打赏
  • 举报
回复
; int main()
;
push ebp
mov ebp,esp
push ecx
;
; {
; someClass s(100);
;
@1:
mov eax,100
xor eax,eax
;
; }



; int main()
;
push ebp
mov ebp,esp
push ecx
;
; {
; someClass s=someClass(100);
;
@1:
mov eax,100
xor eax,eax
;
; }


看看这两段代码,你发现这根本就没有区别。SomeClass s=SomeClass(100);
直接被优化成了 SomeClass s(100);

而汇编码的结果也仅仅是 mov eax,100
这么一条语句而已
积木 2004-08-28
  • 打赏
  • 举报
回复
这里面有几个东西
第一,C++编译器可以在没有拷贝构造函数和operator=这两个函数的时候可以自动的生成这两个函数。
第二,这两个函数只能是由按位拷贝的语义,因此是浅拷贝,当有指针成员的时候,它只能拷贝指针的数值,而不能拷贝指针指向的内容。因此这两个函数仅仅在某些特定的情况下才可能有效的发挥作用。
第三,编译器在编译这段代码的时候,会首先生成一个SomeClass的temp对象,然后再将这个对象付给s,甚至来一个直接的优化。

SomeClass s=SomeClass(100); => s(100)

65,202

社区成员

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

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