C++基础篇(2)(上)

简介: C++基础篇(2)(上)

前言

上节小编讲解了命名空间和函数的输入输出,本节将讲解缺省参数,函数重载等知识。

1.缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参,则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)

全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左

依次连续缺省,不能间隔跳跃给缺省值。

例如(错误示范)

void func(int a, double b = 3.14, const char* c = "default") { // 正确
    // 函数体
}
 
void func(int a = 1, double b, const char* c = "default") { // 错误,不能跳过 b
    // 函数体
}
#include <iostream>
using namespace std;
void func(int x=0) {
  cout << x << endl;
}
int main() {
// 没有传参时,使⽤参数的默认值
// 传参时,使⽤指定的实参
  func();
  func(10);
  return 0;
}

运行结果:

0

10

带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。

#include <iostream>
using namespace std;
// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  cout << "c = " << c << endl << endl;
}
// 半缺省
void Func2(int a, int b = 10, int c = 20)
{
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  cout << "c = " << c << endl << endl;
}
int main()
{
  Func1();
  Func1(1);
  Func1(1, 2);
  Func1(1, 2, 3);
  Func2(100);
  Func2(100, 200);
  Func2(100, 200, 300);
    Func2(100, ,300);//错误
  return 0;
}

函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省

值。

// 在头文件中的函数声明
void func(int a = 1, double b = 3.14, const char* c = "default");
 
// 在源文件中的函数定义
void func(int a, double b, const char* c) {
    // 函数体
}

2.函数重载

在C++中,函数重载(Function Overloading)是指在同一作用域内可以存在多个同名函数,但这些函数的参数列表(参数的个数、类型或者顺序)必须不同。编译器会根据传递给函数的参数来决定调用哪一个重载版本。

2.1函数重载的基本规则

 

1.参数数量不同:函数可以具有不同数量的参数。

#include <iostream>
using namespace std;
int Add(int a, int b) {
  return a + b;
}
 
int Add(int a, int b, int c) { 
  return a + b + c;
}
 
int main() {
  int sum1 = Add(10, 20);   
  double sum2 = Add(10,20,30); 
 
  cout << "sum1: " << sum1 << endl;
  cout << "sum2: " << sum2 << endl;
  return 0;
}

2. 参数类型不同:函数可以具有不同类型的参数。

#include <iostream>
using namespace std;
int add(int a, int b) {
  cout << "int add(int a, int b)"<<endl;
    return a + b;
 
}
double add(double a, double b) {
  cout << "double add(double a, double b)"<<endl;
    return a + b;
 
}
int main() {
  int sum1 = add(10, 20);   
  double sum2 = add(1.5, 2.5); 
 
  cout << "sum1: " << sum1 << endl;
  cout << "sum2: " << sum2 << endl;
  return 0;
}

3. 参数顺序不同:如果参数类型相同,但顺序不同,也可以构成重载。

#include <iostream>
using namespace std;
void f(int a, char b)
{
  cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
  cout << "f(char b, int a)" << endl;
}
int main() {
  f(10, 'c');
  f('c', 10);
  return 0;
}


2.2注意事项

- 返回类型:函数重载与返回类型无关,即不能仅通过改变返回类型来重载函数。
-默认参数:使用默认参数的函数可能会导致重载解析的歧义,应当小心使用。

int Add(int a, int b) {
    return a + b;
}
 
double Add(int a, int b) { // 错误:不能仅通过返回类型来重载
    return static_cast<double>(a + b);
}
#include <iostream>
using namespace std;
 
// 下⾯两个函数构成重载
// f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁
void f()
{
  cout << "f()" << endl;
}
void f(int a = 10)
{
  cout << "f(int a)" << endl;
}
int main() {
  f();
  return 0;
}

2.3 重载解析(Overload Resolution)--补充内容

当调用一个重载函数时,编译器会根据提供的实参和每个重载函数的形参列表进行匹配,以确定调用哪一个函数。这个过程称为重载解析。如果编译器无法明确地确定应该调用哪个函数,或者找到多个合适的匹配,就会产生编译错误。

函数重载是C++多态性的一种形式,它允许程序员使用相同的名字来执行相似的操作,这增强了代码的清晰性和可读性。


C++基础篇(2)(下):https://developer.aliyun.com/article/1624928

相关文章
|
应用服务中间件 nginx
Nginx 禁止IP 只允许域名访问
比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500.目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。就可以这样设置:
|
10月前
|
人工智能 自然语言处理 搜索推荐
告别加班!用DeepSeek搭建全自动爆款图文工厂
随着人工智能技术的飞速发展,图文创作迎来了革命性飞跃。DeepSeek作为强大的AI工具,可批量生成高质量图文笔记,精准适配小红书、抖音、B站等平台。通过明确选题、撰写提示词,用户能轻松定制内容风格,涵盖字体、背景、颜色等多方面细节。从注册登录到生成HTML代码,再到优化处理图片,DeepSeek为创作者提供了全流程支持,助力打造爆款内容。无论是分析爆款笔记还是二次创作,DeepSeek都能大幅提升效率,引领潮流风向标。
545 25
|
10月前
|
关系型数据库 测试技术 分布式数据库
刷新世界纪录!阿里云PolarDB凭借创新的「三层解耦」架构刷新TPC-C基准测试世界纪录
刷新世界纪录!阿里云PolarDB凭借创新的「三层解耦」架构刷新TPC-C基准测试世界纪录
|
供应链 搜索推荐 API
1688榜单商品详细信息API接口的开发、应用与收益
1688作为全球知名B2B电商平台,为企业提供丰富的商品信息和交易机会。随着电商发展,企业对数据需求增长,高效获取与利用数据成为提升竞争力的关键。1688榜单商品详细信息API接口应运而生,帮助企业批量获取商品详情,应用于信息采集、校验、同步与数据分析等领域,显著提高运营效率、优化库存管理、提升个性化推荐精准度,并助力制定更有效的市场策略,降低采购成本,最终提升客户满意度,推动企业可持续发展。
309 3
|
缓存 安全 数据安全/隐私保护
BIOS FEATURES SETUP(BIOS功能设定)
ENABLED是开启,DISABLED是禁用,使用PAGE UP和PAGE DOWN可以在这两者之间切换。
327 0
|
人工智能 自然语言处理 算法
Jarvis×百炼,打造大模型智慧出行客服
本次分享由哈啰集团高级算法专家郭佳盛主讲,主题为“Jarvis×百炼,打造大模型智慧出行客服”。内容涵盖AI在智慧出行领域的应用探索、AI加持客服全链路解决方案、哈罗智能客服的大模型应用、大模型在C端与B端的应用探索,以及企业内部大模型构建与运营。通过实例和经验分享,展示了哈啰如何将大模型应用于实际业务,提升用户体验和运营效率。
|
人工智能
ChatGPT 常见错误原因及解决方案:报错、回答不完整等
最近,由人工智能实验室 OpenAI 发布的对话式大型语言模型 ChatGPT 火得一塌糊涂。它可以与人类轻松地对话,无论是多么奇葩的问题 ChatGPT 都不在话下。在体验 ChatGPT 的同时我们也会遇到各种各样的问题,这里我总结了其对话过程中可能会发生的错误以及如何去解决它们。
215993 5
ChatGPT 常见错误原因及解决方案:报错、回答不完整等
|
运维 Kubernetes Devops
平台工程:它是什么?谁来做?怎么做?
大家可能听说过平台工程,这是一个新术语,它为开发和 DevOps 领域中本已拥挤的角色集合增添了新内容。 在这篇文章中,我们将介绍平台工程、它与 DevOps 的区别以及为什么你可能考虑采用平台工程以及谁需要拥有平台工程的能力。
|
前端开发 JavaScript API
深入理解前端开发中的状态管理
【10月更文挑战第7天】深入理解前端开发中的状态管理
Vue3聊天气泡简单实现思路
Vue3聊天气泡简单实现思路
787 0
Vue3聊天气泡简单实现思路

热门文章

最新文章