2
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);
}

上面的代码给出了相同的输出...是否接受参数是结构/结构的地址。

谁能向我解释这种行为?

谢谢

4

6 回答 6

3

它将对 struct anup1的引用传递给函数。

void structpass_2( struct anup1 &b)

看看什么是参考:参考

struct函数参数列表中也不需要关键字,您可以编写:

void structpass_1(anup1 b) // accepting structure
void structpass_2(const anup1& b) // accepting address of a structure

const如果它是只读的,则将限定符添加到参数

于 2013-01-18T22:17:04.337 回答
2
void structpass_2( struct anup1 &b)

这是拿来参考的。指针将带有*.

于 2013-01-18T22:16:44.680 回答
2

structpass_1您的结构中是按值anup1传递的,因此完成了本地副本并将其传递给函数。

相反,在structpass_2结构中被传递by reference,即指向结构实例的指针被传递给函数(你有指针语义但值语法)。没有完成整个结构的本地副本。

请注意,对于仅包含一个通过值或引用传递的整数的简单结构,从性能角度来看是相同的。但是当您拥有更复杂(更大)的数据时,通过引用传递会更有效。

按值传递与按引用传递的两种情况之间的一个重要区别是,如果您在函数体内修改结构实例,则只有通过引用传递结构时,修改才会在调用站点持久化。相反,当您按值传递结构时,由于在函数体内完成了本地复制,因此在函数退出时修改会丢失。例如:

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)
}
于 2013-01-18T22:31:07.023 回答
1

第二个功能

void structpass_2( struct anup1 &b)

在 C++ 语法中是按引用传递,按引用传递只会将对象的地址传递给函数。

而第一个功能

void structpass_1(struct anup1 b)

使用按值传递。它将首先制作结构 a 的副本,然后传递给函数。通过引用传递更有效。

于 2013-01-18T22:18:22.070 回答
0

这些函数对于程序员来说是等价的,它们唯一的区别在于底层的机器代码——第一个对副本(对象)进行操作,第二个通过引用(实际上是指针)对原始对象进行操作。

您得到的输出是 100% 正确的。

于 2013-01-18T22:19:33.947 回答
0

简单地说,第一个创建对象的精确副本。这对于优化代码很有用,但如果您不想修改原始对象,请记住使用const 。

于 2013-01-18T22:44:02.707 回答