C++ 基础

C++ 主页 C++ 概述 C++ 环境设置 C++ 基本语法 C++ 注释 C++ Hello World C++ 省略命名空间 C++ 标记 C++ 常量/字面量 C++ 关键字 C++ 标识符 C++ 数据类型 C++ 数字数据类型 C++ 字符数据类型 C++ 布尔数据类型 C++ 变量类型 C++ 变量作用域 C++ 多变量 C++ 基本输入/输出 C++ 修饰符类型 C++ 存储类 C++ 数字 C++ 枚举 C++ 枚举类 C++ 引用 C++ 日期和时间

C++ 运算符

C++ 运算符 C++ 算术运算符 C++ 关系运算符 C++ 逻辑运算符 C++ 位运算符 C++ 赋值运算符 C++ sizeof 运算符 C++ 条件运算符 C++ 逗号运算符 C++ 成员运算符 C++ 强制类型转换运算符 C++ 指针运算符 C++ 运算符优先级 C++ 一元运算符

C++ 控制语句

C++ 决策语句 C++ if 语句 C++ if else 语句 C++ 嵌套 if 语句 C++ switch 语句 C++ 嵌套 switch语句 C++ 循环类型 C++ while 循环 C++ for 循环 C++ do while 循环 C++ Foreach 循环 C++ 嵌套循环 C++ break 语句 C++ continue 语句 C++ goto 语句

C++ 字符串

C++ 字符串 C++ 循环遍历字符串 C++ 字符串长度 C++ 字符串连接 C++ 字符串比较

C++ 函数

C++ 函数 C++ 多函数参数 C++ 递归函数 C++ 返回值 C++ 函数重载 C++ 函数重写 C++ 默认参数

C++ 数组

C++ 数组 C++ 多维数组 C++ 指向数组的指针 C++ 将数组传递给函数 C++ 从函数返回数组

C++ 结构 &联合

C++ 结构 C++ 联合

C++ 指针

C++ 指针 C++ 解引用 C++ 修改指针

C++ 类和对象

C++ 面向对象 C++ 类 &对象 C++ 类成员函数 C++ 类访问修饰符 C++ 静态类成员 C++ 静态数据成员 C++ 静态成员函数 C++ 内联函数 C++ this 指针 C++ 友元函数 C++ 指向类的指针

C++ 构造函数

C++ 构造函数 &析构函数 C++ 默认构造函数 C++ 参数化构造函数 C++ 复制构造函数 C++ 构造函数重载 C++ 带默认参数的构造函数 C++ 委托构造函数 C++ 构造函数初始化列表 C++ 使用构造函数动态初始化

C++ 继承

C++ 继承 C++ 多重继承 C++ 多级继承

C++ 面向对象

C++ 重载 C++ 多态性 C++ 抽象 C++ 封装 C++ 接口 C++ 虚函数 C++ 纯虚函数与抽象类

C++ 文件处理

C++ 文件和流 C++ 文件读取

C++ 进阶

C++ 异常处理 C++ 动态内存 C++ 命名空间 C++ 模板 C++ 预处理器 C++ 信号处理 C++ 多线程 C++ Web 编程 C++ 套接字编程 C++ 并发 C++ 高级概念 C++ Lambda 表达式 C++ unordered_multiset

C++ 实用资源

C++ 问答 C++ 快速指南 C++ 速查表 C++ STL 教程 C++ 标准库 C++ 实用资源 C++ 讨论


C++ 中的默认参数

默认参数

C++ 中的默认参数是在声明函数时赋给函数参数的值。如果调用者在调用函数时未提供任何参数,则会自动赋值。如果调用者在函数调用期间提供了参数值,则会覆盖默认值。

语法

return_type function_name(param1 = v1, param2 = v2, ...);

此处

  • return_type 定义返回值的类型,例如 int、float、void。
  • function_name 是用户定义的函数名称。
  • param1param2 是函数参数的名称。
  • v1v2 是分配给这些参数的默认值。

默认参数规则

在 C++ 中定义默认参数时,应遵循以下关键规则,以确保代码高效且无错误。

1. 默认参数必须在函数声明中指定,而不是定义中。

第一条规则规定,默认参数必须在函数声明(原型)中指定,而不是在函数定义(实现)中指定。
如果在定义中指定了默认参数,或者在声明和定义中都指定了默认参数,则会引发编译错误。

示例

// 带有默认参数的函数声明
void greet(string name = "TutorialsPoint");

// 不带默认参数的函数定义(正确)
void greet(string name) {
    cout << message << ", " << name << "!" << endl;
}

2. 默认参数必须从右到左赋值

赋值默认参数时,必须从最右边个参数开始,到最左边个参数,并且用户不能跳过中间的参数赋值。

示例

// 有效
void funcA(int x, string y = "TutorialsPoint");

// 有效
void funcB(int x = 2006, string y = "TutorialsPoint" );

// 无效,因为默认参数必须从右到左赋值
void funcC(int x = 2006, int y);

3.默认参数不可更改或修改

一旦在函数声明中指定了默认参数,则在任何其他声明或定义中都不可更改或修改该参数。否则将抛出错误。

示例

void func(int x = 10); // 第一个声明
void func(int x = 20); // 第二个声明,将导致错误

4. 函数重载的歧义

从重载函数中调用默认参数可能会导致歧义,如果提供的参数不唯一,编译器将难以确定要调用哪个版本的函数。因此,请确保具有默认参数的函数在重载中不会相互冲突。

示例

void get(string name = "TutorialsPoint"); // 函数 1
void get(string name = "TutorialsPoint", int num = 2016); // 函数 2

get(); // 编译器应该选择哪个函数?

默认参数示例

这是一个简单的例子,展示了 C++ 中的默认参数。

#include <iostream>
using namespace std;

int main() {
    double price, discount = 12.0;  // 默认折扣

    cout << "Enter the price of the item: ";
    cin >> price;

    double total = price - (price * discount / 100);
    cout << "The total price after a " << discount << "% discount is: " << total << endl;

    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

Enter the price of the item: 120
The total price after a 12% discount is: 105.6

表达式形式的默认参数

定义函数时,用户可以指定参数的默认值,这些默认值可以是常量值,也可以是表达式(包含变量、常量或函数调用),并在函数调用时进行求值。

示例

以下是默认函数参数的示例。

#include <iostream>
using namespace std;

double total_price(double price, double discount = 12.0) {
    return price - (price * discount / 100);
}

int main() {
    double price;

    cout << "Enter the price of the item: ";
    cin >> price;

    // 默认以 12% 的折扣计算总价
    double total = total_price(price);

    cout << "The total price after a 12% discount is: " << total << endl;

    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

Enter the price of the item: 120
The total price after a 12% discount is: 105.6

函数调用中的默认参数

调用函数来确定默认值称为函数调用中的默认参数。这会根据函数的逻辑或其他参数动态计算默认值。

#include <iostream>
#include <cmath>  // for value of 
using namespace std;

double getDefaultWidth() {
    return 5.0;
}
double getDefaultRadius() {
    return 3.0; 
}

double cuboid_vol(double l, double h, double w = getDefaultWidth()) {
    return l * w * h;
}
double cylinder_vol(double h, double r = getDefaultRadius()) {
    return M_PI * r * r * h;  
}

int main() {
    double length = 10.0; 
    double height = 7.0; 

    // 具有默认宽度的长方体的体积
    cout << "Cuboid volume : " << cuboid_vol(length, height) << " cubic units" << endl;

    // 自定义宽度的长方体的体积
    cout << "Cuboid volume (custom width): " << cuboid_vol(length, height, 4.0) << " cubic units" << endl;

    // 具有默认半径的圆柱体的体积
    cout << "Cylinder volume (default radius): " << cylinder_vol(height) << " cubic units" << endl;

    // 具有自定义半径的圆柱体的体积
    cout << "Cylinder volume (custom radius): " << cylinder_vol(height, 6.0) << " cubic units" << endl;

    return 0;
}

当编译并执行上述代码时,它会产生以下结果 -

Cuboid volume : 350 cubic units
Cuboid volume (custom width): 280 cubic units
Cylinder volume (default radius): 197.92 cubic units
Cylinder volume (custom radius): 791.681 cubic units

默认参数的优势

  1. 它通过减少重载的数量来简化函数调用,当一个函数可以通过使用参数的默认值来处理不同的情况时,用户无需创建多个重载函数。
  2. 默认参数有助于避免代码重复并减少冗余
  3. 它提高了代码的可读性增加了灵活性,这使得将来的修改更加容易。