社区
C++ 语言
帖子详情
类接口参数 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
打赏
收藏
类接口参数 const & 不明白?
对于类 class Test { public: Test(void); ~Test(void); void setString(const std::string& str); protected: std::string mStr; }; 对于函数setString 为什么函数的参数是const &类型 看到很多的sdk都是这么设计的 对于传递局部变量的引用的话 会出问题吗? 小弟菜鸟 求教了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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"有两份,单就这个过程而言。
const
&&&&&&&&&&&&&来一波
就
const
直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重
const
1. 限定符声明变量只能被读
const
int i=5; int j=0; ... i=j; //非法,导致编译错误 j=i; //合法 2. 必须初始化
const
...
C语言返回值是
const
类
型,C++中
const
用法总结
1.1.1. 定义普通常量使用#define来定义常量也是常用方法,但
const
也可以用来定义常量,在[Effective C++]中建议使用
const
代替#define来定义常量,因为
const
定义的常量具有
类
型信息,而宏没有,所以使用
const
定义的...
const
用法详解
(2)
const
可以修饰函数的
参数
、返回值. 加粗样式 详细内容: 1、什么是
const
? 常
类
型是指使用
类
型修饰符
const
说明的
类
型,常
类
型的变量或对象的值是不能被更新的。(当然,我们可以偷梁换柱进行更新:) 2、为什么...
const
用法详解(转)
面向对象是C++的重要特性....就
const
直接可以取代c中的#define 以下几点很重要,学不好后果也也很严重
const
1. 限定符声明变量只能被读
const
int i=5; int j=0; ...
学习笔记:C++学习笔记
类
模板究竟要不要
接口
与实现分离? ???? “C++ 编译器是不支持对模板的...此时这个
类
不属于外部的
类
,不能通过外部
类
的对象直接调用内部
类
,外部的
类
对内部的
类
没有任何优越的访问权限。 … function is not marked
const
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章