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

目录
相关文章
|
12月前
|
存储 编译器 C#
C#基础补充
C#基础补充
58 0
|
SQL 关系型数据库 MySQL
通用分页的详细讲解看这一篇就够了(内含源码)(上)
通用分页的详细讲解看这一篇就够了(内含源码)
107 0
|
1天前
|
存储 分布式计算 安全
C++基础篇(2)(下)
C++基础篇(2)(下)
8 0
|
5月前
|
算法 图计算
什么是图计算?请简要解释其概念和特点。
什么是图计算?请简要解释其概念和特点。
242 0
|
11月前
|
存储 Kubernetes API
k8s教程(基础篇)-基本概念和术语(下)
k8s教程(基础篇)-基本概念和术语(下)
78 0
|
SQL Java 关系型数据库
通用分页的详细讲解看这一篇就够了(内含源码)(下)
通用分页的详细讲解看这一篇就够了(内含源码)(下)
72 0
|
编译器 C语言 C++
C++入门(一)(上)
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度 的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
97 0
C++入门(一)(上)
|
存储 并行计算 测试技术
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
165 0
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
运算符(较为基础,基础篇)(二)
运算符(较为基础,基础篇)(二)
58 0
运算符(较为基础,基础篇)(一)
运算符(较为基础,基础篇)(一)
61 0