fra*_*ben 2 c++ reference function
我正在学习C++,特别是我已停止参考.如果我的问题对你们大多数人来说都是微不足道的,我很抱歉,但我想了解这个程序的输出:
#include <iostream>
using namespace std;
struct myStruct
{
int a;
int b;
};
typedef struct myStruct myStruct;
myStruct copyMyStruct(myStruct& source)
{
myStruct dest;
dest.a=source.a;
dest.b=source.b;
return dest;
}
myStruct otherCopyMyStruct(myStruct& source)
{
myStruct dest;
dest=source;
return dest;
}
myStruct& GetRef(myStruct& source)
{
return source;
}
void printMyStruct(string name,const myStruct& str)
{
cout<<name<<".a:"<<str.a<<endl;
cout<<name<<".b:"<<str.b<<endl;
}
myStruct one,two,three,four;
myStruct& five=one;
void printStructs()
{
printMyStruct("one",one);
printMyStruct("two",two);
printMyStruct("three",three);
printMyStruct("four",four);
printMyStruct("five",five);
}
int main()
{
one.a=100;
one.b=200;
two=copyMyStruct(one);
three=otherCopyMyStruct(one);
four=GetRef(one);
printStructs();
cout<<endl<<"NOW MODIFYING one"<<endl;
one.a=12345;
one.b=67890;
printStructs();
cout<<endl<<"NOW MODIFYING two"<<endl;
two.a=2222;
two.b=2222;
printStructs();
cout<<endl<<"NOW MODIFYING three"<<endl;
three.a=3333;
three.b=3333;
printStructs();
cout<<endl<<"NOW MODIFYING four"<<endl;
four.a=4444;
four.b=4444;
printStructs();
cout<<endl<<"NOW MODIFYING five"<<endl;
five.a=5555;
five.b=5555;
printStructs();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
one.a:100
one.b:200
two.a:100
two.b:200
three.a:100
three.b:200
four.a:100
four.b:200
five.a:100
five.b:200
NOW MODIFYING one
one.a:12345
one.b:67890
two.a:100
two.b:200
three.a:100
three.b:200
four.a:100
four.b:200
five.a:12345
five.b:67890
NOW MODIFYING two
one.a:12345
one.b:67890
two.a:2222
two.b:2222
three.a:100
three.b:200
four.a:100
four.b:200
five.a:12345
five.b:67890
NOW MODIFYING three
one.a:12345
one.b:67890
two.a:2222
two.b:2222
three.a:3333
three.b:3333
four.a:100
four.b:200
five.a:12345
five.b:67890
NOW MODIFYING four
one.a:12345
one.b:67890
two.a:2222
two.b:2222
three.a:3333
three.b:3333
four.a:4444
four.b:4444
five.a:12345
five.b:67890
NOW MODIFYING five
one.a:5555
one.b:5555
two.a:2222
two.b:2222
three.a:3333
three.b:3333
four.a:4444
four.b:4444
five.a:5555
five.b:5555
Run Code Online (Sandbox Code Playgroud)
我的问题:为什么"两个","三个"和"四个"的变化不会对"一个"产生变化?
我可以猜到"两个"和"三个"会发生什么:可能是成员复制到新创建的变量的成员,但我不明白为什么"四"的变化没有反映在"一个"(和"五"):毕竟我从GetRef函数返回一个引用....
提前致谢!
变量four是一个对象,而不是一个引用.
从引用分配给它时four=GetRef(one);,four不会变成引用.赋值复制引用引用的任何内容(在这种情况下,该引用是one).之后,对象是不相关的.所以four = GetRef(one);有同样的效果four = one;.
myStruct &five = one;另一方面,声明five为引用(不是对象),并将对象"绑定" one到引用.因此,名称five和名称one引用相同的对象,这意味着当然可以使用其他名称查看使用任一名称所做的更改.
顺便说一下,typedef struct myStruct myStruct;在C++中不需要[*] .在C++中,类类型只能通过名称引用,而结构类型是类.
[*]除了一个有点奇怪的角落情况,你有一个与类同名的函数,其参数与该类的某些构造函数的参数兼容.那么你可能会认为Foo(x,y)函数Foo和构造函数调用之间的表达式是不明确的Foo.但是没有 - 在没有typedef的情况下,C当然会选择函数,因此为了与C兼容,C++也做同样的事情.大多数人都认为这种情况不足以在C++中编写typedef.