当前位置: 首页 > article >正文

函数的返回值

 

先看下这段代码

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


http://www.kler.cn/a/6852.html

相关文章:

  • R语言基础入门详解
  • WPF MVVM框架
  • ADS 2022软件下载与安装教程
  • IO技术详解
  • Docker 基础命令介绍和常见报错解决
  • sqli—labs靶场 5-8关 (每日4关练习)持续更新!!!
  • ToBeWritten之Radare2 使用教程
  • [oeasy]python0129_unicode_中文字符序号_十三道大辙_字符编码解码_eval_火星文
  • Linux系统(Ubuntu) 安装和使用MySQL (5.0) ---- 保姆级教程
  • OD-求字符串中所有整数的最小和(Python)
  • 新加坡量子软件公司Horizon完成1810万美元A轮融资
  • 【多线程与高并发】1、线程的基本概念
  • 腾讯会议10秒编译百万代码|鹅厂编译加速标杆案例公开
  • 互联网坊间鄙视链,现在反过来了?
  • STM32F4_外部中断详解(EXTI)
  • row_number 和 cte 使用实例:分组轮流排班
  • 【独家】华为OD机试 - 狼羊过河 or 羊、狼、农夫过河(C 语言解题)
  • 基于单片机的室内空气质量检测系统设计_kaic
  • 2023年全国最新二级建造师精选真题及答案44
  • IOS - 某段子APP分析
  • 接口测试4:企业微信接口自动化
  • 实现js程序在vscode控制台输出的方法(看完方便多了)
  • 红黑树(算法导论版)
  • nginx反向代理网页502、SSL_do_handshake()握手失败
  • 聊聊MySQL主从延迟
  • SpringBoot整合XXL分布式任务调度(图文详细)