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

C++笔记 缺省值 函数重载 名字空间域(基础核心)

本文为C++基础核心知识点笔记,聚焦「缺省值」「函数重载(概念)」「名字空间域」三大高频基础考点,语言通俗、重点突出,兼顾入门理解和考试记忆,适合新手入门、作业复习及GitHub归档。

一、缺省值(默认参数)

1. 什么是缺省值?

缺省值(也叫默认参数),是指在函数声明或定义时,给函数的参数指定一个默认值。当调用该函数时,如果没有给这个参数传值,编译器就会自动使用这个默认值;如果传值了,就用传入的值覆盖默认值。

核心作用:简化函数调用,减少重复代码,提升代码可读性。

2. 缺省值的基本语法

格式:函数返回值类型 函数名(参数类型 参数名 = 默认值) { ... }

示例(基础用法):

#include <iostream> using namespace std; // 给参数b设置缺省值10 int add(int a, int b = 10) { return a + b; } int main() { cout << add(5) << endl; // 未传b,使用缺省值10,输出15 cout << add(5, 20) << endl; // 传b=20,覆盖缺省值,输出25 return 0; }

3. 缺省值的核心规则(必记)

从右到左连续设置:缺省参数必须从最右边的参数开始设置,不能跳跃。比如int add(int a=5, int b)是错误的,必须先给b设缺省值,再给a设。

声明与定义不能重复设置:如果函数声明和定义分离(比如头文件声明、源文件定义),缺省值只能在声明中设置,定义中不能重复写(否则编译报错)。

缺省值必须是常量或全局变量:不能用局部变量作为缺省值(局部变量生命周期有限,编译时无法确定其值)。

不能同时出现多个缺省值冲突:同一个参数只能有一个缺省值,不能重复定义。

4. 常见误区

错误示例1(跳跃设置缺省值):

// 错误:a在左,b在右,不能只给a设缺省值 int func(int a=10, int b);

正确示例(从右到左):

int func(int a, int b=10, int c=20); // 正确,从右到左连续设置

错误示例2(声明与定义重复缺省值):

// 头文件声明(已设缺省值) int add(int a, int b=10); // 源文件定义(重复设置,错误) int add(int a, int b=10) { return a + b; }

正确示例(只在声明中设置):

// 头文件声明 int add(int a, int b=10); // 源文件定义(不写缺省值) int add(int a, int b) { return a + b; }

二、函数重载(概念)

1. 什么是函数重载?

函数重载是C++的核心特性之一,指的是:在同一个作用域内,可以定义多个函数名相同,但参数列表不同的函数。编译器会根据调用时传入的参数,自动匹配对应的函数。

核心作用:解决“功能相似但参数不同”的函数命名问题,简化代码调用(不用记多个不同名字的函数)。

2. 函数重载的核心条件(必须同时满足)

判断两个函数是否构成重载,只看「参数列表」,与返回值、函数修饰符无关:

  • 参数个数不同

  • 参数类型不同

  • 参数顺序不同(前提是参数类型不同,否则无意义)。

3. 函数重载示例(直观理解)

#include <iostream> using namespace std; // 1. 无参数 void print() { cout << "无参数print函数" << endl; } // 2. 1个int参数(参数个数不同,构成重载) void print(int a) { cout << "int参数:" << a << endl; } // 3. 1个double参数(参数类型不同,构成重载) void print(double a) { cout << "double参数:" << a << endl; } // 4. 两个参数,顺序不同(int+double 和 double+int,构成重载) void print(int a, double b) { cout << "int+double:" << a << "," << b << endl; } void print(double a, int b) { cout << "double+int:" << a << "," << b << endl; } int main() { print(); // 调用无参数版本 print(10); // 调用int参数版本 print(3.14); // 调用double参数版本 print(10, 3.14); // 调用int+double版本 print(3.14, 10); // 调用double+int版本 return 0; }

4. 常见误区(不构成重载的情况)

仅返回值不同,不构成重载:比如int add(int a,int b)double add(int a,int b),调用时编译器无法根据参数区分,报错。

仅参数名不同,不构成重载:比如int add(int a,int b)int add(int x,int y),参数名不同但类型、个数、顺序都一样,属于重复定义,报错。

参数顺序相同,仅类型相同,不构成重载:比如int func(int a, int b)int func(int b, int a),参数顺序不同但类型都是int,无意义,不构成重载。

缺省值不同,不构成重载:比如int add(int a=10)int add(int a=20),参数列表完全一致,属于重复定义,报错。

5. 函数重载的底层原理(补充,便于理解)

C++能实现函数重载,核心是「名字修饰(名字粉碎)」——编译器会根据函数的参数列表,给每个重载函数生成唯一的符号名(比如print(int)修饰为_Z5printiprint(double)修饰为_Z5printd),链接时就能准确匹配调用的函数。而C语言没有名字修饰,所以不支持函数重载。

三、名字空间域(namespace)

1. 什么是名字空间域?

名字空间域(简称命名空间),是C++用来解决「命名冲突」的特性。它可以将变量、函数、类等封装在一个独立的“域”中,不同域中的同名变量、函数互不干扰。

比如:两个不同的库中,都有一个叫func()的函数,直接使用会冲突;用命名空间包裹后,就可以通过“命名空间::函数名”的方式区分调用。

2. 名字空间的基本语法

(1)定义命名空间

格式:namespace 命名空间名 { 变量、函数、类的定义... }

#include <iostream> // 定义命名空间A namespace A { int a = 10; void func() { cout << "命名空间A的func函数" << endl; } } // 定义命名空间B namespace B { int a = 20; // 与A中的a同名,不冲突 void func() { // 与A中的func同名,不冲突 cout << "命名空间B的func函数" << endl; } }
(2)使用命名空间中的内容

有3种方式,优先推荐前两种(规范、避免冲突):

  1. 指定命名空间(最规范):命名空间名::成员名

  2. 使用using声明(局部生效):using 命名空间名::成员名; (只引入某个具体成员,避免全局污染)

  3. 使用using指令(全局生效,谨慎使用):using namespace 命名空间名; (引入整个命名空间的所有成员,可能导致命名冲突)

  4. 解决命名冲突:不同模块、不同库中的同名成员,用命名空间隔离,避免编译报错。

  5. 组织代码:将相关的变量、函数、类归到一个命名空间,让代码结构更清晰(比如C++标准库的所有内容,都在std命名空间中,这也是我们常用using namespace std的原因)。

  6. 命名空间可以嵌套:一个命名空间中可以包含另一个命名空间。

  7. 匿名命名空间:没有名字的命名空间,其成员只能在当前文件中访问(等价于给成员加了static,实现文件作用域)。

  8. std命名空间:C++标准库(cout、cin、string等)都在std命名空间中,所以如果不写using namespace std,就必须用std::coutstd::cin的方式调用。

  9. 判断:int func(int a=5, int b=10)int func(int a=10, int b=5)构成函数重载?(答案:不构成,参数列表完全一致,仅缺省值不同)

  10. 判断:void print(int a)void print(double a)构成函数重载?(答案:构成,参数类型不同)

  11. 写出代码:定义一个命名空间MySpace,包含变量num=5和函数show()(输出num),并在main函数中调用。

  12. 缺省值设置:定义一个函数sub(int a, int b=5),调用时传入10,输出结果是多少?(答案:10-5=5)

http://www.jsqmd.com/news/549168/

相关文章:

  • Qwen3-ASR-1.7B效果展示:实测22种方言识别,准确率惊人
  • 语音转文本任务中的CER与WER:从理论到实践
  • 高效解决华硕笔记本色彩配置难题:G-Helper开源工具的智能恢复方案
  • RVC版本怎么选才不踩坑?本人微星GL62M 7REX实测数据|低配卡专属实操指南
  • 别再手动造数据了!用Modbus Slave模拟真实PLC,5分钟搞定Modbus协议测试
  • 梦幻动漫魔法工坊案例分享:从文字描述到精美动漫图的完整过程
  • 《荣耀出征:奇迹MU》安徽游昕官方正版下载:12区开服前瞻 全玩法解析与新手指南
  • OpenClaw性能调优:nanobot镜像的vllm参数配置详解
  • OnlyOffice Workspace团队协作六:高级安全与权限管理实战
  • 卡尔曼滤波家族对决:传统KF vs EnKF在气象预测中的性能对比
  • 联想拯救者BIOS隐藏选项一键解锁:释放笔记本全部潜能
  • 基于Matlab的IMU姿态解算之旅:四元数姿态的奇妙融合
  • 3分钟搞定日语字幕:N46Whisper让你的视频制作效率提升300%
  • 高效协作的Markdown新范式:CodiMD实时编辑工具全解析
  • PCS双向储能变流器Buck-Boost闭环控制仿真【复现】 复现参考文献:《储能电站变流器设...
  • 惠州金属不锈钢立柱批发厂家费用多少,哪家值得推荐? - 工业品网
  • C++ 虚表与多态:从源码到汇编的逐步解析
  • 看完就会:2026年真正好用的专业AI论文工具
  • Lychee Rerank多模态系统在社交媒体分析中的实践
  • 重新定义指针体验:Apple Cursor的技术革新与实践指南
  • 别再手动截图了!用这个FISH脚本把FLAC3D 6.0/7.0的应力云图一键导出到Tecplot
  • Codeforces Round 1082 (Div. 2)2202
  • 如何快速创建黑苹果EFI:OpCore-Simplify智能配置工具完整指南
  • RTX4090D优化版Qwen3-32B镜像实战:降低OpenClaw任务Token消耗50%
  • OpenClaw跨平台控制:nanobot镜像对接多终端实践
  • OpenClaw配置备份指南:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF模型参数迁移方案
  • 别再傻傻分不清!雷达、激光雷达、超声波在ROS2里到底怎么选?实战避坑指南
  • Z-Image-Turbo-辉夜巫女创意海报生成实战:快速产出节日营销与活动宣传素材
  • 分析佛山冠捷五金,作为不锈钢立柱专业制造商靠谱吗,价格贵吗 - 工业品牌热点
  • 三步打造高效办公效率工具:罗技鼠标宏自定义配置全场景适配指南