首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于 const string& !该怎么处理

2013-12-10 
关于 const string& !!1.入参[codec++]string test(const string& in_oStrParam) {return string(in_oStr

关于 const string& !!
1.入参
[code=c++]string test(const string& in_oStrParam) {
    return string(in_oStrParam).append("haha");
}[/code]

[code=c++]string test(string in_oStrParam) {
    return string(in_oStrParam).append("hehe");
}[/code]
有何区别?

2.返回值为 const string& 的,用于哪种情景?
我看 protocol buffer 里面的实体类是以这种形式返回成员的

3.求普及相关的其他一些 c++ 写法
[解决办法]
1 传值 和传引用的区别!(这不知道的话,得找本基础的书好好补补c++基础了)
2 对于引用,可以减少中间的一些临时对象,减少构造函数,拷贝构造这些函数的调用!提高效率
3 写发看具体实际需求吧返回引用,以及传递引用也是用的比较普遍了
[解决办法]

引用:
Quote: 引用:

1 传值 和传引用的区别!(这不知道的话,得找本基础的书好好补补c++基础了)
2 对于引用,可以减少中间的一些临时对象,减少构造函数,拷贝构造这些函数的调用!提高效率
3 写发看具体实际需求吧返回引用,以及传递引用也是用的比较普遍了

解释的很明白,感谢!
对于常规的函数的话,const string& 的返回应该是没有意义的吧?
因为方法内的string 对象大抵都在走到方法最后的时候被释放掉了,返回的引用没有任何实际意义。
是否 const string& 只适用于作为 实体内的 getter 返回(实体类的 string 成员作用于比较宽广,仅在类对象析构时才释放)?
另外,vector<string>,list<string>在调用 ->push_back() 方法时,是否也有类似的方法来避免重复的构造和析构呢?


有用的!string本身也是一个很繁杂的class的!这么用肯定不是这么三言两语的可以否决的!
push_back的时候要看push进去的是什么吧!如果是对象的话,就是提高效率,避免调用那些接口了!
[解决办法]
引用:
Quote: 引用:
一般只会把const string&作为参数吧,没见过作为返回类型的。

有的,google 的 protocol buffer 库这种用法非常常见


这种用法也比较常见呀,像类进行某些运算符重载的时候,为了实现链式操作,也有的常常返回 const&
最常见的就是,那cout了
cout<<"a"<<"b";
[解决办法]
具体看需求了,确保返回引用的对象一直存在就ok的。
除了13楼的cout,还有操作符重载中 T& operator=里面返回*this,
[解决办法]
引用:
Quote: 引用:

class foo{
std::string hehe;
const std::string& test() const{
    hehe =("hehehaha");
    return hehe;
};
};


似乎是,这样处理的吧

好眼熟,box2d 里面这种写法好像很多,const string& 返回类型没有疑问,test() 后面加的这个 const 功效为何呢?

买本C++Primer看看吧,这些知识全有
[解决办法]
可以少几次构造和析构,如果传变量,进去的时候构造,离开析构,如果这个函数在一个大函数里被调用N次,&的话这N次的构造和析构可以不执行。
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:
This is the fastest way when you want to modify paramater and return the updated value.

也就是说,其间所产生的两次构造是无可避免的咯?没有最优化的方法了?
string test(const sring& in_oStrParam) {
    return string(in_oStrParam).append("hehe");
}
为什么这么写会比你之前贴出的慢,能说一下原因么?


Because compiler constucts the object in place for you, which is faster. 

If you want to modify original string, this is the fastest
string& test( sring& in_oStrParam) {
    return in_oStrParam.append("hehe");
}




额,明白了,你的意思是入参处由编译器执行的拷贝构造比我在方法体中自己调用的构造要神速,是这个意思吧?
string& test(string& in_oStrParam) 这个很有用
以前不知深浅时总喜欢写成如下款式:
string appendSuffixPng(string in_oStrParam) {
    return in_oStrParam.append(".png");
}
void main() {
    string t_oStrName("nice");
    t_oStrName = appendSth(t_oStrName);
    ...
}
其实这样也不错哇:
void appendSuffixPng(string& in_oStrParam) {
    in_oStrParam.append(".png");
}
直接就在源对象上追加就行了


Yup.  入参处由编译器执行的拷贝构造比我在方法体中自己调用的构造要神速, this is correct.

string& appendSuffixPng(string& in_oStrParam) {
    in_oStrParam.append(".png");
}

The reason to return "string&" is because you can chain calls:



string s;
appendSuffxPng(s).append("somethingElse");


if you return void, you can't chain calls like this.
[解决办法]
返回 const string& 也相当常见。 8楼的例子几本说明问题。目的是防止返回的引用的内容被修改。
比如用来在一个const成员函数中返回一个私有变量的引用,这个返回值别人可以读,但不能改, 那使用const string&返回可以避免一些copy操作。

对楼主的疑惑我想重点应该说明的是:函数的返回值不一定总是函数内的局部变量,也可以是静态变量、成员变量、全局变量的引用(或指针)。
[解决办法]
Yes, it's guaranteed that kNodeTypeBad will be 13 and kNodeWorse will be 14. This is specified by C++ standard.

An enumerator-definition without an initializer gives the
enumerator the value obtained by increasing the value of the previous enumerator by one.
 
[解决办法]
对楼主的疑惑我想重点应该说明的是:函数的返回值不一定总是函数内的局部变量,也可以是静态变量、成员变量、全局变量的引用(或指针)。
顺便问一个问题,枚举的声明相关
enum NodeType {
    kNodeTypeGood = 12,
    kNodeTypeBad,
    kNodeTypeWorse,
}
是否 kNodeBad == 13, kNodeWorse == 14?提前拜谢!
因为我对这点不是很明白,所以每次枚举里面我都会显式的写明:
enum NodeType {
    kNodeTypeGood = 12,
    kNodeTypeBad = 13,
    kNodeTypeWorse = 14,
}


就是前一个加1

enum node{
  a = 2
  b --3
  c = 5
  d --6
}
[解决办法]
const string& in_oStrParam//传引用,速度快,这里的const修饰说明在这个函数中不能这个in_oStrParam修改操作
string in_oStrParam//传一个值,有复制操作,如果in_oStrParam有1M的字节,那将会有个复制1M的过程

热点排行