问一个构造函数的问题

hbwin2006 2006-06-21 04:51:35
string s="abc"//这个我知道,是调用了 string的构造函数

const string& s="abc" //这个过程里发生了什么事,难道是先生成了一个临时变量,再把他赋给引用??

请高手指点!
...全文
90 8 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
我想你说的是对的,第二种形式应该会出现问题。

64,644

社区成员

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

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