读书人

初学者请问C++代码

发布时间: 2012-02-17 17:50:42 作者: rapoo

菜鸟请教C++代码
比较下面两段代码:
(1)
const string & findMax(const vector <string> & arr)
{
int maxIndex=0;

for(int i=1;i <arr.size();i++)
if(arr[maxIndex] <arr[i])
maxIndex=i;

return arr[maxIndex];
}

(2)
const string & findMaxWrong(const vector <string> & arr)
{
int maxValue=arr[0];

for(int i=1;i <arr.size();i++)
if(maxValue <arr[i])
maxValue=arr[i];

return maxValue
}

(1)书上说第二段代码是错的,请教大虾为什么?
(2)函数名里的string &是什么意思?为什么不是直接返回string
(3)形参里为什么也用vector <string> &?为什么不直接用vector <string> ?
以前我学的C#就是直接这样传引用数组的。

[解决办法]
(3)形参里为什么也用vector <string> &?为什么不直接用vector <string> ?
以前我学的C#就是直接这样传引用数组的。
-------------------------
如果不加&,就是传值而不是传引用了。
[解决办法]
(2)函数名里的string &是什么意思?为什么不是直接返回string

-------------------------------------
这个跟第三问差不多的意思,也是引用
[解决办法]
(1)书上说第二段代码是错的,请教大虾为什么?
----------------------------------------------
return maxValue
这句话返回了一个局部对象,结果是未定义的。
个人意见,高手指教。
[解决办法]
(1)书上说第二段代码是错的,请教大虾为什么?
===============================================
函数返回类型为string&...
是引用!!!!
maxValue是局部的...
[解决办法]
好象传引用的效率高点....
[解决办法]
返回了局部对象的引用,如同返回了局部对象的地址一样,当那个有局部对象的函数返回了,其栈就销毁了,因此这个返回值是一个未知值。
[解决办法]
(1) 的确是错的,
错误有两点
1. string maxValue = arr[0]; //maxValue应该是string类型
2. return maxValue; //这条语句返回了局部对象的引用,函数返回后局部对象生命
//期结束,继续引用会造成未定义行为


(2) string & 是返回引用,直接返回string属于按值传递, 因为在c++中按值传递会产生拷贝
,对于向string这样的类类型对象,产生拷贝会严重影响效率,所以在不是一定需要用到拷贝的时候使用引用可以大大提高效率.
(3) 同(2)中一样vector <string> 传递参数是按值传递同样会产生拷贝使效率下降,因而采用引用的方式。
[解决办法]
const vector <string> & arr可能会改变const的值
[解决办法]
const vector <string> & arr的值可能会被函数改变
[解决办法]
(1)书上说第二段代码是错的,请教大虾为什么?

正如DonaldKnuth(克努特) 所说,返回的是局部对象的引用,离开函数之后,这个引用已是垃圾

(2)函数名里的string &是什么意思?为什么不是直接返回string

返回string&可以避免调用string的拷贝构造函数,而只是返回一个地址,当string越大时,这种返回方式效率越高

(3)形参里为什么也用vector <string> &?为什么不直接用vector <string> ?
以前我学的C#就是直接这样传引用数组的。


形参里用这个也是为了效率,另外怕形参被意外修改,前面加上const
[解决办法]
(1)书上说第二段代码是错的,请教大虾为什么?
(2)函数名里的string &是什么意思?为什么不是直接返回string
(3)形参里为什么也用vector <string> &?为什么不直接用vector <string> ?
以前我学的C#就是直接这样传引用数组的。
--------------
1.返回值类型错误;还有就是maxValue为local,如果return local的地址,那么会产生错误.局部变量已经不存在.
2.返回引用传递,传递的是地址,不会产生副本,快
3.通上
[解决办法]
同意,Q1中的返回引用是不对的,就如同返回函数中局部变量的地址一样,函数一结束局部变量就销毁了,返回的引用指向的单元的内容是无意义的。把返回值类型string&改为string这样返回的是一份maxvalue的拷贝,就可以了。Q3中传引用而不传值是为了提高效率,因为传值的话将会把整个对象都拷贝一份传到函数内,如果对象比较大的话,效率会变的低下。所以用传引用代替传值。
[解决办法]
第一个问题的解决办法可以把maxValue声明为static int maxValue,这样,maxValue直到程序结束才销毁.
第二和第三个问题也就迎刃而解
[解决办法]
JF,帮顶

读书人网 >C++

热点推荐