函数的返回值
先看下这段代码
struct Role
{
string Name;
int Hp;
int Mp;
};
Role CreatMonster(string str, int hp, int mp)
{
Role ghost{ str,hp,mp };
return ghost;
}
int main()
{
Role ghost{ CreatMonster("A",1000,1000) };
std::cout << ghost.Name;
system("pause");
}
这种方法有2个缺陷
1.耗费内存,函数体内还定义了一个结构体,如果这个结构体成员有很多个呢
2.第14行,进行结构体赋值时,如果要赋值500个或者更多的结构体变量呢,就要用到动态数组了,也就是指针
那该怎么做呢,一是返回引用,二是返回指针
返回指针
typedef struct Role
{
string Name;
int Hp;
int Mp;
} *Prole;
Prole CreatMonster(string str, int hp, int mp)
{
Prole ghost = new Role{ str,hp,mp };
return ghost;
}
int main()
{
Prole ghost{ CreatMonster("A",1000,1000) };
std::cout << ghost->Name;
system("pause");
}
这里第九行应该是new一块内存,因为当返回值是指针类型时,不能返回一个局部变量
知识扩展*:为什么不能返回局部指针变量,却可以返回局部变量
函数的局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收,函数不能返回局部变量的地址,因为如果返回局部变量的地址,系统回收后,指针指向的内容就无意义了。不会报错,但是程序结果会出错
返回值为引用
typedef struct Role
{
string Name;
int Hp;
int Mp;
} *Prole;
Role& CreatMonster(string str, int hp, int mp)
{
Prole ghost = new Role{ str,hp,mp };
return *ghost;
}
int main()
{
Role& ghost{ CreatMonster("A",1000,1000) };
std::cout << ghost->Name;
system("pause");
}
数组引用做参数
int add(int a[3])
{
int sum{0};
for (int x : a)
{
sum += x;
}
std::cout << sum;
return 0;
}
int main()
{
int a[3]{ 0,1,2 };
add(a);
system("pause");
}
这段代码编译是不通过的,因为x并不知道a的范围i,而可以改成引用传递参数,将第一行代码改成int add(int (&a)[3])即可
void add(int a[3])
{
std::cout << sizeof(a);
}
int main()
{
int a[3]{ 0,1,2 };
add(a);
system("pause");
}
这里输出的结果为4,因为a[3]本质上是一个指针,而如果改成引用int(&a)[3],输出结果为12