struct anup1 {
int a;
};
void structpass_1(struct anup1 b) // accepting structure
{
cout << b.a;
};
void structpass_2(struct anup1& b) // accepting address of a structure
{
cout << b.a;
};
int main() {
struct anup1 a2;
a2.a = 100;
structpass_1(a2);
structpass_2(a2);
}
上面的代码给出了相同的输出...是否接受参数是struct的结构/地址。
有人可以向我解释这种行为吗?
由于
答案 0 :(得分:3)
它将reference传递给struct anup1到函数。
void structpass_2( struct anup1 &b)
了解什么是参考资料:reference
在函数参数列表中也不需要关键字struct
,您可以写:
void structpass_1(anup1 b) // accepting structure
void structpass_2(const anup1& b) // accepting address of a structure
如果参数只是
,请将const
qulifier添加到参数中
答案 1 :(得分:2)
void structpass_2( struct anup1 &b)
这是参考。指针将带有*
。
答案 2 :(得分:2)
在structpass_1
中,您的结构anup1
按值传递,因此本地副本已完成并传递给该函数。
相反,在structpass_2
中传递结构by reference
,即将指向结构实例的指针传递给函数(您具有指针语义但值语法)。没有完成整个结构的本地副本。
请注意,对于仅包含一个按值传递或通过引用传递的整数的简单结构,从性能角度来看是相同的。但是当你有更复杂(和更大)的数据时,通过引用传递会更有效。
两个传递值与传递引用的情况之间的一个重要区别是,如果你修改函数体内的结构实例,只有当结构通过引用传递时,修改才是坚持在呼叫站点。相反,当您按值传递结构时,由于本地副本在函数体内完成,因此当函数退出时,修改将丢失。 e.g:
void structpass_1(anup1 b) // pass by value
{
cout << b.a << '\n';
b.a++; // modification lost at the call site
};
void structpass_2(anup1& b) // pass by reference
{
cout << b.a << '\n';
b.a++; // the caller will see the incremented value for b.a
};
int main()
{
anup1 a2;
a2.a = 100;
structpass_1(a2); // will print 100
structpass_2(a2); // will print 100
cout << a2.a; // willl print 101 (structure modified by structpass_2)
}
答案 3 :(得分:1)
第二个功能
void structpass_2( struct anup1 &b)
在C ++语法中是通过引用传递,通过引用传递将简单地将对象的地址传递给函数。
虽然第一个功能
void structpass_1(struct anup1 b)
使用pass by value。它将首先制作struct a的副本,然后传递给该函数。通过引用传递更有效。
答案 4 :(得分:0)
这些函数对于程序员来说是等价的,它们唯一的区别在于底层机器代码 - 第一个在副本(一个对象)上运行,第二个通过引用在原始对象上运行(所以真的是指针)。
您获得的输出是100%正确的。
答案 5 :(得分:0)
简单地说,第一个创建对象的精确副本。这对于优化代码很有用,但如果您不想修改原始对象,请记得使用 const 。