在下面的代码中,我尝试将一个简单的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
,这意味着原始a
在func()
返回后保持不变。
因此,不是按值传递成员(并且在char[]
时传递地址),似乎struct student
作为一个整体传递给func()
。
struct
和许多其他实践一样,会让其成员决定如何传递给函数。原则二就像built-in array
可能会占用大量内存一样,它应该传递一个指针,而不是内存中的所有内容,所以应该struct
,特别是当struct可能有几个{{1}时成员。
请不要详细说明built-in array
如何传递给函数。
答案 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
作为参数传递而不使用&
或*
(也就是指针或引用)将使其按值传递。
答案 1 :(得分:1)
它应该传递指针,而不是内存中的所有内容,
不,将复制阵列的所有元素。您没有自己声明副本,并且隐式定义的复制构造函数的行为如下所示。
根据标准,$ 12.8 / 15复制和移动类对象[class.copy](由我粗体显示)
非联合类X的隐式定义的复制/移动构造函数 执行其基础和成员的成员复制/移动。
让x成为 构造函数的参数。每个基础或非静态数据成员 以适合其类型的方式复制/移动:
(15.1) - 如果 member是一个数组,每个元素都是直接初始化的 相应的x子对象;
答案 2 :(得分:1)
我相信您正在使用C ++默认复制构造函数。
复制参数,因为它是一个数组常量(a [8]),所以复制整个数组,而不是指向它的指针。
喜欢通过引用传递(f(学生和学生))。