& 操作符作为返回值的问题

H_olic 2012-02-20 01:22:36
“引用(&)将指向调用该操作符的对象”
上面这句话怎么理解捏?举以下3个例

//例一
int name1=5;
int & name2=name1;//我知道的是“name2”自此为name1的别名
//例二
void funtion1 (int& x)//“引用(&)将指向调用该操作符的对象”---是不是就理解为指向temp 的"int*"指针?
{ ####### };
int main()
{
int temp=6;
function1(temp);
};
//例三
class A
{
private:
int var
public :
A& function2 (A&);

}
A& A::function2 (A&s)//这里的&怎么理解捏
{#######};
...全文
143 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
H_olic 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 arvonzhang 的回复:]

引用 10 楼 h_olic 的回复:

引用 6 楼 arvonzhang 的回复:

“引用(&)将指向调用该操作符的对象”
//例一
int name1=5;
int &name2=name1;//name2不仅是name1的别名,所有对name2的操作都会影响到name1,他们的内存空间只有一个
//例二
//“引……
[/Quote]
还是有用的说……
丰清云淡 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 h_olic 的回复:]

引用 6 楼 arvonzhang 的回复:

“引用(&)将指向调用该操作符的对象”
//例一
int name1=5;
int &name2=name1;//name2不仅是name1的别名,所有对name2的操作都会影响到name1,他们的内存空间只有一个
//例二
//“引用(&;)将指向调用该操作符的对象”---这里……
[/Quote]

你的最后一个疑问,函数中为何还要返回s
这里举两个例子:
1)比如字符串string类中重载了+=运算符,而这个运算符重载函数返回值就是一个string引用,而且是本身的引用,+=实际上改变了变量本身。比如
string a="abc";
a += "def";
执行结果之后a的值就是“abcdef",而不是将中间结果作为临时对象
2)cout是输出流对象,其重载的<<运算符返回的也是输出流对象的引用(具体来说就是调用operator<<函数的cout对象的引用,也就是它本身啦)
比如ostream& operator<<(ostream &out,string &s)
{
cout << s;
return cout;
}
这样做有什么好处呢?
当执行这样的语句时:
string s;
cout << s;
第二返回的是cout的引用对吧,那么就可以继续调用operator<<函数,实现串操作;
比如
int i =5,d = 6;
string s = ”sdflsdjlf";
cout << s << i << d; //所有的内建类型都重载了operator<<函数
现在你应该知道它的用处了,希望对你有用。
H_olic 2012-02-20
  • 打赏
  • 举报
回复
谢谢大家 我想我知道了…… 分数不多 大家分分吧……
badbirdboy 2012-02-20
  • 打赏
  • 举报
回复
返回一个类型A的引用,你操作这个引用就操作了原始数据
tuccty 2012-02-20
  • 打赏
  • 举报
回复
就是如果返回的类型是A的时候,默认会产生一个临时变量.然后调用时如:A a = function2(...);时,将临时变量的值赋给你外部的变量.如果你的返回类型是A&则不会产生这么一个临时变量.
大致就是上面这样.
H_olic 2012-02-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhongjilei 的回复:]

函数体中使用的对象就是外面传递进入的对象,没有调用拷贝构造函数,如果是
A& A::function2(A s)这样的就会有一个对象的构造过程,函数体中的对象和传递的对象不是一个
[/Quote]
你想说什么?我没理解
支持英文数字 2012-02-20
  • 打赏
  • 举报
回复
引用的一些规则如下:

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。

(2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。

(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

会发现“引用传递”的性质象“指针传递”,而书写方式象“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”这东西?

答案是“用适当的工具做恰如其分的工作”。

指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?

如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如果把取公章的钥匙交给他,那么他就获得了不该有的权利。
H_olic 2012-02-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 nuistbaker 的回复:]

楼主问的就是一个引用(&)的问题,你可以理解为:
A& 就是A

特性是
1:A&可以在任何时候当作A使用
2:输入A&时,可以改变调用处的输入值
3:输出时,即返回时,可以将函数内部的对象直接传出,类似指针。
[/Quote]
“A&可以在任何时候当作A使用”这说法也太粗糙了……
nuistbaker 2012-02-20
  • 打赏
  • 举报
回复
楼主问的就是一个引用(&)的问题,你可以理解为:
A& 就是A

特性是
1:A&可以在任何时候当作A使用
2:输入A&时,可以改变调用处的输入值
3:输出时,即返回时,可以将函数内部的对象直接传出,类似指针。
H_olic 2012-02-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 arvonzhang 的回复:]

“引用(&amp;)将指向调用该操作符的对象”
//例一
int name1=5;
int &name2=name1;//name2不仅是name1的别名,所有对name2的操作都会影响到name1,他们的内存空间只有一个
//例二
//“引用(&;)将指向调用该操作符的对象”---这里&不是temp的int *指针,而是temp变量的别名,操作x和操作……
[/Quote]
A& A::function2 (A&s)
{
//这里对s进行操作
return s;
};
为什么要return s; 你想教我什么?
H_olic 2012-02-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 arvonzhang 的回复:]

“引用(&amp;)将指向调用该操作符的对象”
//例一
int name1=5;
int &name2=name1;//name2不仅是name1的别名,所有对name2的操作都会影响到name1,他们的内存空间只有一个
//例二
//“引用(&;)将指向调用该操作符的对象”---这里&不是temp的int *指针,而是temp变量的别名,操作x和操作……
[/Quote]
“参数中的&和例二类似,返回值中的&则相当于返回对象a本身,如果这里没有&符号的话,在返回时会构造一个临时对象,增加额外的开销,”-----------你这句话我这么理解:
A& function2 (A&)
的返回值相等价于一个某个“ A object ”。不用引用作为返回值就会创建一个临时的“A tempoobject ”对吗??
iamnobody 2012-02-20
  • 打赏
  • 举报
回复
破书。
zhongjilei 2012-02-20
  • 打赏
  • 举报
回复
函数体中使用的对象就是外面传递进入的对象,没有调用拷贝构造函数,如果是
A& A::function2(A s)这样的就会有一个对象的构造过程,函数体中的对象和传递的对象不是一个
丰清云淡 2012-02-20
  • 打赏
  • 举报
回复
“引用(&)将指向调用该操作符的对象”
//例一
int name1=5;
int &name2=name1;//name2不仅是name1的别名,所有对name2的操作都会影响到name1,他们的内存空间只有一个
//例二
//“引用(&;)将指向调用该操作符的对象”---这里&不是temp的int *指针,而是temp变量的别名,操作x和操作temp的效果完全一致,这样一定程度上扩展了temp变量的作用域范围,通常情况下在function1函数中,如果temp不是全局变量的话,是不能直接访问的,但使用引用可以做到
void funtion1 (int &x)
{ ####### };

//例三
class A
{
private:
int var
public :
A& function2 (A&);

}
/*参数中的&和例二类似,返回值中的&则相当于返回对象a本身,如果这里没有&符号的话,在返回时会构造一个临时对象,增加额外的开销,此外使用返回值引用可以执行串操作例如
A a,b,c,d,e;

//这种方式在使用输入输出对象的时候特别有用,例如:
a.function2(b).function2(c).function2(d).function2(e);
int x,y,z;
cin >> x >> y >> z; //operator<<函数返回的就是cin对象的引用
*/
A& A::function2 (A&s)
{
//这里对s进行操作
return s;
};
H_olic 2012-02-20
  • 打赏
  • 举报
回复
各位问下面注释中的问题

class A
{
private:
int var
public :
A& function2 (A&);

}
A& A::function2 (A&s)//这里的&怎么理解捏
赵4老师 2012-02-20
  • 打赏
  • 举报
回复
指针即地址
引用即别名
Eleven 2012-02-20
  • 打赏
  • 举报
回复
C++中的引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。
例如: Point pt1(10,10);
Point &pt2=pt1; 定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。
需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:
pt1.offset(2,2);
pt1和pt2都具有(12,12)的值。
引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才
初始化它。例如下面语句是非法的:
Point &pt3;
pt3=pt1;
H_olic 2012-02-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tuccty 的回复:]

省掉了中间的临时变量.
[/Quote]
你说什么?
tuccty 2012-02-20
  • 打赏
  • 举报
回复
省掉了中间的临时变量.

64,637

社区成员

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

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