C++函数返回值与重载函数详解
发布时间: 2025-08-16 01:07:30 阅读量: 2 订阅数: 24 


C++编程语言精要与实践指南
本书《C++编程语言》第三版由C++之父比雅尼·斯特劳斯特鲁普撰写,旨在全面介绍C++语言的核心概念、语法结构及高级特性。书中不仅涵盖了C++的基础设施,如类型和声明、指针、数组、表达式、语句、函数等,还深入探讨了面向对象编程、泛型编程、异常处理等抽象机制。此外,本书详细解析了C++标准库,包括容器、算法、迭代器、字符串、流等内容,并提供了大量实用的例子。最后一部分聚焦于使用C++进行软件设计的原则与技巧,帮助读者掌握从具体到抽象的学习路径,更好地理解并应用C++解决实际问题。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。
# C++ 函数返回值与重载函数详解
## 1. 函数返回值
### 1.1 返回值规则
在 C++ 中,非 `void` 类型的函数必须返回一个值,但 `main()` 函数是特殊的。相反,`void` 类型的函数不能返回值。以下是一些示例:
```cpp
int f1() { } // error: no value returned
void f2() { } // ok
int f3() { return 1; } // ok
void f4() { return 1; } // error: return value in void function
int f5() { return; } // error: return value missing
void f6() { return; } // ok
```
### 1.2 返回语句
返回值通过 `return` 语句指定。例如,下面是一个递归函数的示例:
```cpp
int fac(int n) { return (n>1) ? n*fac(n-1) : 1; }
```
一个调用自身的函数被称为递归函数。函数中可以有多个 `return` 语句,如下所示:
```cpp
int fac2(int n)
{
if (n > 1) return n*fac2(n-1);
return 1;
}
```
### 1.3 返回值语义
函数返回值的语义与初始化的语义相同。`return` 语句被认为是初始化一个返回类型的无名变量。返回表达式的类型会与返回类型进行检查,并执行所有标准和用户定义的类型转换。例如:
```cpp
double f() { return 1; } // 1 is implicitly converted to double(1)
```
### 1.4 避免返回局部变量的指针或引用
每次调用函数时,会创建其参数和局部(自动)变量的新副本。函数返回后,这些存储会被重用,因此永远不应该返回指向局部变量的指针。指向的位置的内容会不可预测地改变:
```cpp
int* fp() { int local = 1; /* ... */ return &local; } // bad
```
使用引用返回局部变量的错误更常见:
```cpp
int& fr() { int local = 1; /* ... */ return local; } // bad
```
幸运的是,编译器可以很容易地警告返回局部变量的引用。
### 1.5 `void` 函数的返回
`void` 函数不能返回值。然而,`void` 函数的调用不会产生值,因此 `void` 函数可以在 `return` 语句中使用 `void` 函数的调用作为表达式。例如:
```cpp
void g(int* p);
void h(int* p) { /* ... */ return g(p); } // ok: return of ‘‘no value’’
```
这种返回形式在编写返回类型是模板参数的模板函数时很重要。
## 2. 重载函数名
### 2.1 函数重载的概念
大多数情况下,给不同的函数取不同的名字是个好主意,但当一些函数在概念上对不同类型的对象执行相同的任务时,给它们取相同的名字会更方便。对不同类型的操作使用相同的名字称为重载。C++ 中的基本操作已经使用了这种技术,例如加法运算符 `+` 可以用于整数、浮点数和指针类型的加法。这个概念很容易扩展到程序员定义的函数。例如:
```cpp
void print(int); // print an int
void print(const char*); // print a C-style character string
```
从编译器的角度来看,同名函数唯一的共同点就是名字。推测这些函数在某种意义上是相似的,但语言并不限制或帮助程序员。因此,重载函数名主要是一种符号上的便利。对于具有常规名称的函数,如 `sqrt`、`print` 和 `open`,这种便利很重要。当一个名字在语义上很重要时,这种便利就变得至关重要,例如在运算符(如 `+`、`*` 和 `<<`)、构造函数和泛型编程中。
### 2.2 重载函数的调用解析
当调用一个函数 `f` 时,编译器必须确定要调用哪个名为 `f` 的函数。这是通过比较实际参数的类型与所有名为 `f` 的函数的形式参数的类型来完成的。目标是调用与参数最匹配的函数,如果没有最匹配的函数,则给出编译时错误。例如:
```cpp
void print(double);
void print(long);
void f()
{
print(1L); // print(long)
print(1.0); // print(double)
print(1); // error, ambiguous: print(long(1)) or print(double(1))?
}
```
从一组重载函数中找到要调用的正确版本是通过寻找参数表达式的类型与函数的参数(形式参数)之间的最佳匹配来完成的。为了近似我们认为合理的概念,会



0
0
相关推荐











SW_孙维
开发技术专家
知名科技公司工程师,开发技术领域拥有丰富的工作经验和专业知识。曾负责设计和开发多个复杂的软件系统,涉及到大规模数据处理、分布式系统和高性能计算等方面。
专栏目录
最低0.47元/天 解锁专栏
赠100次下载



最新推荐

如何用MATLAB Simulink优化单相逆变器闭环控制:案例分析,理论实践双丰收

# 1. 单相逆变器基础知识与闭环控制概述
## 1.1 单相逆变器的基本原理
单相逆变器是电力电子设备中的一种重要装置,它能够将直流电能转换为交流电能。这种转换对在直流电源与交流负载之间建立连接,特别是在太阳能光伏发电系统和不间断电源(UPS)中,是至关重要的。单相逆变器通过特定的开关模式来控制功率晶体管,实现将直流电(DC)转换为所需频率和幅值的交流电

Coze实战应用:项目集成与利用的高效策略

# 1. Coze技术概览
## 1.1 Coze技术的定义与起源
Coze是一种先进的集成技术,起源于需要优化不同系统和平台之间通信的复杂IT环境。其核心目标是简化系统集成的复杂性,并提升数据交换的效率与安全性。
## 1.2 C

【Coze视频制作最佳实践】:制作高质量内容的技巧

# 1. Coze视频制作基础与工作流概述
## 引言
在当今数字化时代,视频内容已成为沟通和信息传递的核心手段。对于Coze视频而言,它不仅仅是一种视觉呈现,更是具备高度参与性和交互性的媒体艺术。制作一部优秀的Coze视频需要一套精心设计的工作流程和创作原则。
## 基础概念与重要性
Coze视频制作涉及到剧本创作、拍摄技术、后期制作等众多环节。每个环节都直接影响到最终的视频质量。在开始制作之前,理

Matlab正则表达式:递归模式的神秘面纱,解决嵌套结构问题的终极方案

# 1. Matlab正则表达式基础
## 1.1 正则表达式的简介
正则表达式(Regular Expression)是一串字符,描述或匹配字符串集合的模式。在Matlab中,正则表达式不仅用于文本搜索和字符串分析,还用于数据处理和模式识别。掌握正则表达式,能够极大提高处理复杂数据结构的效率。
## 1.2 Matlab中的正则表达式工具
Matlab提供了强大的函数集合,如`reg

AI旅游攻略未来趋势:Coze AI的深度分析与趋势预测

# 1. AI旅游攻略概述
## 1.1 AI技术在旅游行业中的融合
人工智能(AI)技术正在逐渐改变旅游行业,它通过智能化手段提升用户的旅游体验。AI旅游攻略涵盖了从旅游计划制定、个性化推荐到虚拟体验等多个环节。通过对用户偏好和行为数据的分析,AI系统能够为用户提供量身定制的旅游解决方案。
## 1

【Coze智能体的伦理考量】:如何处理历史敏感性问题,让你的教学更具责任感!

# 1. Coze智能体与伦理考量概述
## 智能体简介
在数字化时代,智能体(Agent)已经成为一个普遍的概念,指的是能够在环境中自主运行,并对外部事件做出反应的软件程序。它们可以支持多种任务,从信息检索到决策制定。但随着技术的发展,智能体的应用越来越广泛,尤其是在处理历史信息等领域,其伦理考量逐渐成为社会关注的焦点。
## Coze智能体与历史信息处理
Coze智能

直流电机双闭环控制优化方法

# 1. 直流电机双闭环控制基础
## 直流电机双闭环控制简介
直流电机的双闭环控制系统是将电机的速度和电流作为控制对象,采用内外两个控制回路,形成速度-电流双闭环控制结构。该系统能够有效提高电机的动态响应速度和运行稳定性,广泛应用于高精度和高性能要求的电机控制系统中。
## 控制回路的作用与必要性
在双闭环控制结构中,内环通常负责电流控制,快速响应电机的负载变化,保证电机运行的平稳性。外环则

MATLAB电子电路仿真高级教程:SPICE兼容性与分析提升

# 1. MATLAB在电子电路仿真中的作用
## 1.1 电子电路仿真的必要性
电子电路设计是一个复杂的过程,它包括从概念设计到最终测试的多个

【MATLAB数据挖掘】:心电信号异常模式的识别与预测,专家级方法

# 1. 心电信号挖掘的理论基础
在现代医学诊断中,心电信号(ECG)的精确挖掘和分析对于预防和治疗心血管疾病具有至关重要的意义。心电信号挖掘不仅仅局限于信号的捕获和记录,而是一个多维度的信息处理过程,它涉及到信号的采集、预处理、特征提取、模式识别、异常预测等多个环节。本章将对心电信号挖掘的理论基础进行详细介绍,为后续章节中的数据处理和模式识别等技术提供坚实的理论支撑。
## 1.1

【技术更新应对】:扣子工作流中跟踪与应用新技术趋势

# 1. 理解工作流与技术更新的重要性
在IT行业和相关领域工作的专业人士,了解并掌握工作流管理与技术更新的重要性是推动业务成长与创新的关键。工作流程是组织内部进行信息传递、任务分配和项目管理的基础,而技术更新则是保持组织竞争力的核心。随着技术的快速发展,企业必须紧跟最新趋势,以确保其工作流既能高效运转,又能适应未来的挑战。
工作流的优化可以提高工作效率
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



专栏目录
最低0.47元/天 解锁专栏
赠100次下载


