社区
C++ 语言
帖子详情
白痴问题:原来构造函数可以直接调用的?
jorge
2004-08-28 05:16:04
一个类:
class SomeClass
{
public:
SomeClass(int x);
};
在类之外居然可以这样写:
SomeClass s=SomeClass(100);
说来惭愧,还是俺MM玩C++时发现的,和我说,我说这怎么可能呢,一试验,我那个糗啊……
怪本人学艺不精,还望大侠指点,这种语法代表什么,有什么用处呢?
...全文
550
9
打赏
收藏
白痴问题:原来构造函数可以直接调用的?
一个类: class SomeClass { public: SomeClass(int x); }; 在类之外居然可以这样写: SomeClass s=SomeClass(100); 说来惭愧,还是俺MM玩C++时发现的,和我说,我说这怎么可能呢,一试验,我那个糗啊…… 怪本人学艺不精,还望大侠指点,这种语法代表什么,有什么用处呢?
复制链接
扫一扫
分享
转发到动态
举报
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)
linux下shellcode编写手册
- C++编译器会生成特定的汇编指令来实现各种功能,如函数
调用
、对象构造等。通过分析这些汇编指令,可以更好地理解C++程序的行为。 - 例如,函数
调用
通常涉及将参数压入栈中、
调用
函数本身、然后恢复栈指针等操作。 ...
C++中
构造函数
和虚拟函数的微妙关系
构造函数
和虚拟函数之间存在许多比较微妙的关系,比如
构造函数
不能是虚拟函数,构造函 数不能正常
调用
虚拟函数等等,本文将会讨论产生这些
问题
的原因。
C++学习笔记碎屑--结构体与
构造函数
结构体必须有
构造函数
才能在用new动态分分配空间的时候进行初始化,如果要创建结构体数组,那么必须要有默认
构造函数
。类对象也是。 struct AAA { int data;... //
调用
默认
构造函数
AAA *b=new AAA{1}; /
C++中
构造函数
和析构函数
在前面的《关于C++中的new》,我犯了一个很
白痴
的错误:new是一个用来动态... 为了了解
构造函数
和析构函数,写了下面的程序: class myclass{public: myclass(); ~myclass(); void myfun();private: int member;};m
Java基础知识查漏补缺(Java核心技术)----对象和类
依赖关系(dependence):聚合关系(aggregation):继承关系(inheritance)知识点2知识点3 final关键字知识点4:工厂方法知识点5:main方法知识点6:知识点7:方法签名知识点8:默认
构造函数
知识点9:
调用
另一个方法的...
C++ 语言
65,202
社区成员
250,522
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章