struct如何传递给函数?

时间:2016-01-11 01:56:56

标签: c++ arrays struct

在下面的代码中,我尝试将一个简单的struct变量传递给func()函数,看看当struct返回时原始func()变量会发生什么。

#include<iostream>
#include<string>
struct student
{
    char name[8];
};
void func(student a)
{
    a.name[1] = 'Z';
}
int main()
{
    student a;
    strcpy(a.name, "abcde");
    func(a);
    cout << a.name;
}

它打印出abcde,而不是aZcde,这意味着原始afunc()返回后保持不变。

因此,不是按值传递成员(并且在char[]时传递地址),似乎struct student作为一个整体传递给func()

如果这是真的,我很困惑,因为这似乎违反了一些原则。我原本以为struct和许多其他实践一样,会让其成员决定如何传递给函数。原则二就像built-in array可能会占用大量内存一样,它应该传递一个指针,而不是内存中的所有内容,所以应该struct,特别是当struct可能有几个{{1}时成员。

请不要详细说明built-in array如何传递给函数。

3 个答案:

答案 0 :(得分:3)

有三种方法可以将参数传递给C ++中的函数:

1 - 按值(默认)

2-参考

3 by pointer(从技术上讲是按值,但是传递的值是特殊的扭曲地址)

func(student a)是值,因为您没有指定任何特殊内容。会发生什么情况是您创建了一个局部变量a,您将在其中复制student a的内容(但main中的内容)。函数终止后,本地a将被销毁,因此您的更改不会影响任何内容。

但是如果你想在main中更改struct a的值,你需要通过引用或通过指针传递。例如:

指针:

在主... func(&a) ...中,您的函数func将是

void func(student* a) {
    a->name[1] = 'Z';
}

如果你想通过引用来做,那么主要内容没有变化,但你的函数func将是:

void func(student& a) {
    a.name[1] = 'Z';
}

有关详细说明,请参阅“函数参数”部分中的go here


修改:回应OP说

  

许多其他实践,会让其成员决定如何传递给函数。原理二就像内置数组可能会占用大量内存一样,它应该传递指针,而不是内存中的所有内容[...]只是不要(解释)详细信息如何将结构传递给函数

在C / C ++心态中,几乎没有任何事情在后台完成。它旨在为程序员提供权力,以决定哪种方式更适合特定情况。不利的一面是它使新来者变得更加神秘/困难。

因此,将struct作为参数传递而不使用&*(也就是指针或引用)将使其按值传递。

,C ++不会在背后做一些魔术,而且会保持一致。

答案 1 :(得分:1)

  

它应该传递指针,而不是内存中的所有内容,

不,将复制阵列的所有元素。您没有自己声明副本,并且隐式定义的复制构造函数的行为如下所示。

根据标准,$ 12.8 / 15复制和移动类对象[class.copy](由我粗体显示)

  

非联合类X的隐式定义的复制/移动构造函数   执行其基础和成员的成员复制/移动。

     

让x成为   构造函数的参数。每个基础或非静态数据成员   以适合其类型的方式复制/移动:

     

(15.1) - 如果   member是一个数组,每个元素都是直接初始化的   相应的x子对象;

答案 2 :(得分:1)

我相信您正在使用C ++默认复制构造函数。

复制参数,因为它是一个数组常量(a [8]),所以复制整个数组,而不是指向它的指针。

喜欢通过引用传递(f(学生和学生))。