类接口参数 const & 不明白?

butterflygogogo 2010-08-16 12:00:19
对于类
class Test
{
public:
Test(void);
~Test(void);
void setString(const std::string& str);
protected:
std::string mStr;
};
对于函数setString 为什么函数的参数是const &类型 看到很多的sdk都是这么设计的
对于传递局部变量的引用的话 会出问题吗?
小弟菜鸟 求教了
...全文
159 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
butterflygogogo 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 adventurelw 的回复:]

lz的问题真是
对于C++函数来说,只要你能执行参数传递这一步,参数部分就不可能出现局部变量失效的问题,因为传递参数之后一定是进入函数体执行相关行为,不可能超出参数的作用域。
比如
void print(const string &s);
int main()
{
string str("hello world");
print(str);
return……
[/Quote]
大侠 我还是有不明白的地方
class Test
{
public:
Test(void);
~Test(void);
void setString(const std::string& str)
{
mStr = str;
}
protected:
std::string mStr;
};
int main()
{
string str("da");
Test t;
t.setString(str);
}
麻烦你给我说下 在调用函数setString的时候 整个过程中是怎么执行的 ?
另外对于我这个函数 我调用后 mStr存放的东西和main函数中str存放的是同一份吗?还是两份一样的?
小弟真不是很明白 求教了
butterflygogogo 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lthyxy 的回复:]

理解有问题。
你仔细去理解一下怎么赋值,怎么传递,怎么消失的
[/Quote]
麻烦你解释下 赋值 传递 消失的
小弟确实是菜鸟 搞的不是很清楚
lovestefanie 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lazy_2010 的回复:]
个人理解;

传引用的优点是少调用了一次 =操作符 或者 少调用了一次 copy constructor,你可以不加引用写一个函数
,然后想办法跟踪一下,在 vc/vs 中调用的时候按 F11,会发现会执行 string 类型的函数;这样,传引用的效率就高;当然,对于简单的 UINT,int,long 类型等,其实没有必要使用引用;

但是,传引用的缺点是,写得不好的函数会修改参数的值;……
[/Quote]
+1
lazy_2010 2010-08-16
  • 打赏
  • 举报
回复
个人理解;

传引用的优点是少调用了一次 =操作符 或者 少调用了一次 copy constructor,你可以不加引用写一个函数
,然后想办法跟踪一下,在 vc/vs 中调用的时候按 F11,会发现会执行 string 类型的函数;这样,传引用的效率就高;当然,对于简单的 UINT,int,long 类型等,其实没有必要使用引用;

但是,传引用的缺点是,写得不好的函数会修改参数的值;改进的办法呢,就是加 const;

加 const 的意思是这个函数当不修改传入参数的数据值;

lovestefanie 2010-08-16
  • 打赏
  • 举报
回复
学习了
liutengfeigo 2010-08-16
  • 打赏
  • 举报
回复
理解有问题。
你仔细去理解一下怎么赋值,怎么传递,怎么消失的
liutengfeigo 2010-08-16
  • 打赏
  • 举报
回复
巨倒!
已经被赋值了,你管那个帮忙赋值的都系存在不存在做什么?
butterflygogogo 2010-08-16
  • 打赏
  • 举报
回复
如果我不明白的地方是 :
传递引用是传地址吧 如果传递局部变量的引用的话 局部变量被释放了 那么被赋值的变量会出问题吗?
pengzhixi 2010-08-16
  • 打赏
  • 举报
回复
只要生存期没问题就OK
liutengfeigo 2010-08-16
  • 打赏
  • 举报
回复
传进去后,赋值以后就没用了,你管他是局部还是什么。
传const 引用比按值传递快。
adventurelw 2010-08-16
  • 打赏
  • 举报
回复
引用是减少复制的代价,你也可以用指针,但比较之下,引用好控制一些。
const的意思他不仅可以接受传递的const类型参数,还可以接受非const参数
而如果没有const的话,则这个函数不能接受const类型参数。
相对于这个参数来说,并不涉及到局部变量的问题。
大昊 2010-08-16
  • 打赏
  • 举报
回复
引用传参是这样的,在汇编中,先将实参保存在栈中,再将实参地址压入栈中,函数内先将参数地址出栈,再获取其内容,所以一般传引用时比较慢的,但是如果是传复杂对象的话,用引用就可以节省大量的参数出栈入栈的时间,因为指针进栈总比复杂对象要快,但引用会有个问题,就是传入参数可能会被改变,所以前面加入一个const保证参数不变。
adventurelw 2010-08-16
  • 打赏
  • 举报
回复
lz的问题真是
对于C++函数来说,只要你能执行参数传递这一步,参数部分就不可能出现局部变量失效的问题,因为传递参数之后一定是进入函数体执行相关行为,不可能超出参数的作用域。
比如
void print(const string &s);
int main()
{
string str("hello world");
print(str);
return 0;
}
str就是main的局部变量,但这毫不影响其以引用传递方式作为print的参数。因为在main结束之前,一定是print先结束。
ForestDB 2010-08-16
  • 打赏
  • 举报
回复
引用免去了对象的生成,快;
const保证了不对引用的东西做出修改。
adventurelw 2010-08-16
  • 打赏
  • 举报
回复
准确说应该是main中的str和setString所获得实参传递到函数体中的str是一份。
形参是没有具体数据的。
butterflygogogo 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 adventurelw 的回复:]

因为是引用传递,所以当str作为实参传递给setString时,setString会复制一份str的引用,至于引用到底是什么,其实在这里没有必要过多了解,只需要知道,当知道了str的引用,也就知道了str本身,可以对str进行一些操作就可以了。所复制的引用你可以将其当成const string &str中的str,也就是到现在为止,这个str就是main中string str("da")……
[/Quote]
那么也就是说 main函数的str和setString中形参的str是一份了?
adventurelw 2010-08-16
  • 打赏
  • 举报
回复
因为是引用传递,所以当str作为实参传递给setString时,setString会复制一份str的引用,至于引用到底是什么,其实在这里没有必要过多了解,只需要知道,当知道了str的引用,也就知道了str本身,可以对str进行一些操作就可以了。所复制的引用你可以将其当成const string &str中的str,也就是到现在为止,这个str就是main中string str("da")的str,其内容同样是"da",当引用的复制完成之后,就进入函数体,完成函数体的行为,这里是mStr = str;执行的是字符串类的赋值操作符,也就是将str的内容"da"赋给mStr,这时mStr的内容也变成"da"了。但是因为字符串类的赋值操作符重载不是通过复制引用或者指针而是通过复制内容完成,那就相当于mStr虽然内容也是"da",但却不是两个str所拥有的那个"da",而是新生成的"da",最终结果是"da"有两份,单就这个过程而言。

64,654

社区成员

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

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