传递结构或类对象

时间:2013-01-18 22:15:36

标签: c++

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的结构/地址。

有人可以向我解释这种行为吗?

由于

6 个答案:

答案 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