社区
C++ 语言
帖子详情
问一个构造函数的问题
hbwin2006
2006-06-21 04:51:35
string s="abc"//这个我知道,是调用了 string的构造函数
const string& s="abc" //这个过程里发生了什么事,难道是先生成了一个临时变量,再把他赋给引用??
请高手指点!
...全文
90
8
打赏
收藏
问一个构造函数的问题
string s="abc"//这个我知道,是调用了 string的构造函数 const string& s="abc" //这个过程里发生了什么事,难道是先生成了一个临时变量,再把他赋给引用?? 请高手指点!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lddLinan
2006-06-21
打赏
举报
回复
临时变量一般在完整表达式结束之后销毁,但是如果临时变量邦定到一个引用上去的时候,他的生命周期会被延长到引用的生命周期。
所以const string& s = "abc";应该不会有问题
lyskyly
2006-06-21
打赏
举报
回复
反汇编一下,的确生成了一个临时对象
const string& s = "abc";
00413608 mov esi,esp
0041360A push offset string "abc" (4166FCh)
0041360F lea ecx,[ebp-34h]
00413612 call dword ptr //构造函数[__imp_std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> > (4192B8h)]
00413618 cmp esi,esp
0041361A call @ILT+330(__RTC_CheckEsp) (41114Fh)
0041361F lea eax,[ebp-34h]
00413622 mov dword ptr [ebp-0Ch],eax //给引用赋值
dang800919
2006-06-21
打赏
举报
回复
编译没有错误...
s这个const string对象 应该是对 "abc"这个const char* 的临时对象的引用
dang800919
2006-06-21
打赏
举报
回复
再补充一下
什么时候会产生临时变量
1. 传递参数的时候 , 要通过隐式转换而使得函数调用成功,比如参数类型不一致 , 然而能通过内定义的类型转换 如:int->double ,char -> string(不是string->char,string->char需要调用string 的一个成员函数 c_str),等等,或者通过你自己定义的转换 operator 转换操作符(很多书都有过介绍)
2. 返回对象的过程
PS.
任何时候 当你看到一个reference-to-const 参数,就非常有可能会产生一个临时对象,绑定到该参数身上,任何时候 只要你看到函数返回一个对象,就会产生临时对象(并于捎后销毁)
PS引用字 more effective C++ 条款20.
小水
2006-06-21
打赏
举报
回复
偶也是菜鸟.
const string& s="abc"
应该不对吧!
dang800919
2006-06-21
打赏
举报
回复
是这样的
#include<string>
#include<iostream>
using namespace std;
int main()
{
const string& s = "abc";
cout<<s<<endl;
system("pause");
return 0;
}
const string& s = "abc" 过程中 产生了一个临时变量 也就是
const string& tmp = "abc" , const string& s = tmp 因为从const char* -> const string&过程中需要一个类型转换,所以会产生一个临时变量 tmp 而后 s 是对tmp这个临时变量的引用,
你说的这种情况应该是在传递参数的时候会用到,tmp会在这条函数语句结束后 自动析构掉,而不会因为在函数体中对s的改变而影响到对const char* 也就是你所说的"abc"的改变.
小水
2006-06-21
打赏
举报
回复
string s="abc"//这个我知道,是调用了 string的构造函数
不时调用构造函数吧,是重载的operator =的运用!
const string& s="abc"
s是常量"abc"的引用!
低调的小青蛙
2006-06-21
打赏
举报
回复
我想你说的是对的,第二种形式应该会出现问题。
C++中可以在
构造函数
中调用另
一个
构造函数
吗?
今天在面试的时候,写了
一个
类,自己在另
一个
构造函数
中调用了另
一个
构造函数
,面试官说,这样不行吧,你回去查查。 后来回来一查,果然我写的有
问
题
。下面一篇文章写的很好详细,我这里转过来,原文来自这里:http://www.cnblogs.com/chio/archive/2007/10/20/931043.html --------从这里开始转载--------- 题目如下:
问
下列代码的打印结果
如何在 Java 中从另
一个
构造函数
调用
一个
构造函数
?
是否可以从另
一个
(在同
一个
类中,而不是从子类中)调用
构造函数
?如果是怎么办?调用另
一个
构造函数
的最佳方法是什么(如果有几种方法可以做到)?
类的赋值
构造函数
和复制
构造函数
C++的初学者经常会对复制
构造函数
一知半解,我曾经对复制
构造函数
和赋值函数就很是迷茫。闲来无事,整理一下,
一个
对象的赋值
构造函数
和赋值
构造函数
。整体的说一下,复制
构造函数
和赋值
构造函数
的相同点是: 赋值运算符和复制
构造函数
都是用已存在的B对象来创建另
一个
对象A; 最大的不同在于:赋值
构造函数
处理两个已有对象,即赋值前B应该是存在的;复制
构造函数
是生成
一个
全新的对象,即调用复制
构造函数
之前A不存在。
C++ String类的
构造函数
、拷贝
构造函数
的实现
构造函数
、析构函数与赋值函数是每个类最基本的函数,在一些公司的面试中也会经常
问
到这方面的
问
题
。每个类只有
一个
析构函数和
一个
赋值函数,但可以有多个
构造函数
(包含
一个
拷贝
构造函数
,其它的称为普通
构造函数
)。对于任意
一个
类A,如果不手动编写上述函数,C++编译器将自动为类A生成四个缺省的函数: A(void); // 缺省的无参数
构造函数
A(con
C++入门:
构造函数
,析构函数,拷贝
构造函数
,运算符重载详解
目录 类的6个默认成员函数 一.
构造函数
1.概念 2.特征如下: 1. 函数名与类名相同。 2. 无返回值。 3. 对象实例化时编译器自动调用对应的
构造函数
。 4.
构造函数
可以重载。 5. 如果类中没有显式定义
构造函数
,则C++编译器会自动生成
一个
无参的默认
构造函数
,一旦用户显式定义编译器将不再生成。 6. 无参的
构造函数
和全缺省的
构造函数
都称为默认
构造函数
,并且默认
构造函数
只能有
一个
。 7. 关于编译器生成的默认成员函数,很多同学会有疑惑: 8. (了解)C++11打的..
C++ 语言
64,644
社区成员
250,475
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章