快速从C过度C++(一):namespace,C++的输入和输出,缺省参数,函数重载
📝前言:
本文章适合有一定C语言编程基础的读者浏览,主要介绍从C语言到C++过度,我们首先要掌握的一些基础知识,以便于我们快速进入C++的学习,为后面的学习打下基础。
这篇文章的主要内容有:
1,命名空间namespace
2,C++的输入和输出
3,缺省参数
4,函数重载
🎬个人简介:努力学习ing
📋个人专栏:C++学习笔记
🎀CSDN主页 愚润求学
🌄其他专栏:C语言入门基础,python入门基础,python刷题专栏
快速从C过度C++(一)
- 一,namespace
- 1. namespace的定义
- 1.1. 作用域
- 1.2. namespace定义
- 2. namespace的使用
- 2.1. 指定namespace
- 2.2. 展开namespace
- 2.2.1. 展开整个namespace
- 2.2.2. 展开单个变量
- 2.3. 使用注意事项
- 二,C++的输入和输出
- 1. 核心概念
- 1.1. 流(Stream)
- 1.2. 标准流对象
- 2. 基本输入和输出操作
- 2.1. 输出
- 2.2. 输入
- 3. 格式化输出
- 3.1. 使用流操纵符
- 3.2. 控制进制
- 4. 文件输入和输出
- 4.1. 文件输出
- 4.2. 文件输入
- 5 提升IO效率
- 三,缺省参数
- 1. 缺省参数的基本用法
- 1.1. 语法
- 2.2. 示例
- 2. 缺省参数的规则
- 2.1. 从右向左设置缺省参数
- 2.2. 函数声明和定义
- 2.3. 调用时的参数匹配
- 2.4. 默认值必须是常量或全局变量
- 四,函数重载
- 1. 函数重载的基本规则
- 1.1. 参数列表必须不同
- 1.2. 示例
- 1.3. 避免歧义调用
一,namespace
1. namespace的定义
1.1. 作用域
在学习namespace前,我们先了解域的概念。
在C语言中,我们学习过全局变量和局部变量,看下面这段代码:
#include<stdio.h>
int a = 10;
int b = 30;
int main() {int a = 20;printf("%d\n", a); //输出 20printf("%d", b); //输出 30return 0;
}
全局变量的作用域是全局,局部变量的作用域是函数内,且局部变量的优先级高于全局变量。除了这两个域,C++中还有命名空间域,类域。域影响的是编译时语法查找一个变量/函数/类型的出处的逻辑,在同一个域中出现同名,就会冲突,如:
int a = 10;
int a = 30;

为了解决这个问题,C++引入了namespace,目的是对标识符的名称进行本地化,以避免冲突。
全局域和局部域还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。
1.2. namespace定义
基本语法:
namespace关键字 + 空间名称 + {} (注意{}后不需要跟;),如:
namespace tr
{// 命名课件内可定义 变量/函数/类int a = 10;int sub(int a, int b) {return a - b;}struct Node {struct Node* next;int val;};
}
2. namespace的使用
2.1. 指定namespace
语法:名称::变量名
::是作用域解析符,用来指定要使用的明明空间中的成员
int a = 10;
namespace tr {int a = 20;
}
int main() {printf("%d", tr::a); //输出20return 0;
}
2.2. 展开namespace
2.2.1. 展开整个namespace
语法:using namespace 命名空间名称
using指令会将命名空间中的所有名称引入到当前作用域(注意若有与当前作用域同名的变量,就会冲突),如:
int a = 10;
namespace tr {int a = 20;
}
using namespace tr; //因为全局已经有一个a,会冲突,正确可以使用tr::a来访问a
因此,展开全部成员的这种方法并不推荐,冲突风险很大
正确用法:
int a = 10;
namespace tr {int b = 20;int c = 30;
}
using namespace tr;
int main() {printf("%d", c); // 输出30return 0;
}
2.2.2. 展开单个变量
语法:using 命名空间名称::变量名称
int a = 10;
namespace tr {int b = 20;int c = 30;
}
using tr::b;
int main() {printf("%d", b); // 输出20return 0;
}
2.3. 使用注意事项
namespace的本质是一个域,与全局域和局部域各自独立,不同的域可以定义同名变量namespace只能定义在全局,可以嵌套定义。- 一个文件中通常不可以有同名的
namespace,如果有,编译器会合并,视作一个 - 不同文件可以有同名的
namespace,链接时,编译器会合并同名的 namespace未被展开或者指定时,默认在局部和全局里面找变量- 将
namespace用using展开后,查找顺序为:局部域→命名空间域→全局域
二,C++的输入和输出
在C++中,输入和输出(I/O)主要通过标准库中的<iostream>头文件提供的流(stream)机制来实现。C++的I/O流库提供了灵活且类型安全的方式来处理输入和输出操作。
1. 核心概念
1.1. 流(Stream)
- 流是数据在源和目标之间流动的抽象。
- 输入流(Input Stream):从外部设备(如键盘、文件)读取数据。
- 输出流(Output Stream):向外部设备(如屏幕、文件)写入数据。
1.2. 标准流对象
C++预定义了以下标准流对象:
std::cin:标准输入流,通常与键盘输入关联。std::cout:标准输出流,通常与屏幕输出关联。std::cerr:标准错误流,用于输出错误信息(无缓冲)。std::clog:标准日志流,用于输出日志信息(有缓冲)。
主要了解前两个
2. 基本输入和输出操作
2.1. 输出
-
使用
std::cout和插入运算符<<将数据输出到屏幕。 -
示例:
#include <iostream>int main() {int num = 42;std::cout << "Hello, World!" << std::endl; // 输出字符串并换行std::cout << "The number is: " << num << std::endl; // 输出变量// 都是以字符串的形式输出,相当于把 << 中间的字符串合并后输出,一个<< <<之间只能放一个变量return 0; } -
std::endl:插入一个换行符并刷新输出缓冲区
2.2. 输入
- 使用
std::cin和提取运算符>>从键盘读取数据。 - 示例:
#include <iostream>int main() {int age;std::cout << "Enter your age: ";std::cin >> age; // 从键盘读取输入并存储到变量 age,多个变量输入时,可用空格,换行符等符号间隔std::cout << "You are " << age << " years old." << std::endl;return 0; } - 注意:
std::cin会跳过空白字符(如空格、制表符、换行符)。
cin和cout自动判断类型
3. 格式化输出
虽然C++提供了多种方式格式化输出,但是我们任然可以继续使用C语言的格式化输出方式,因为C++兼容C语言
下面介绍C++的格式化输出:
3.1. 使用流操纵符
std::setw(n):设置输出宽度为n。std::setprecision(n):设置浮点数精度为n。std::fixed:以固定小数格式输出浮点数。std::scientific:以科学计数法输出浮点数。- 示例:
#include <iostream> #include <iomanip> // 包含流操纵符int main() {double pi = 3.141592653589793;std::cout << std::fixed << std::setprecision(2) << "Pi: " << pi << std::endl;return 0; }
3.2. 控制进制
std::dec:十进制(默认)。std::hex:十六进制。std::oct:八进制。- 示例:
int num = 255; std::cout << std::hex << "Hex: " << num << std::endl; // 输出 ff
4. 文件输入和输出
C++通过<fstream>头文件支持文件操作:
4.1. 文件输出
- 使用
std::ofstream将数据写入文件。 - 示例:
#include <iostream> #include <fstream>int main() {std::ofstream outFile("output.txt");if (outFile.is_open()) {outFile << "Hello, File!" << std::endl;outFile.close();} else {std::cerr << "Failed to open file!" << std::endl;}return 0; }
4.2. 文件输入
- 使用
std::ifstream从文件读取数据。 - 示例:
#include <iostream> #include <fstream> #include <string>int main() {std::ifstream inFile("input.txt");std::string line;if (inFile.is_open()) {while (std::getline(inFile, line)) {std::cout << line << std::endl;}inFile.close();} else {std::cerr << "Failed to open file!" << std::endl; // 若文件未打开使用 std::cerr 输出错误信息。}return 0; }
5 提升IO效率
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
第一句:解除 iostream 与 C 标准库的同步。但要注意,一旦解除同步,就不能再混合使用 C++ 的流操作和 C 的函数操作,否则会导致输入输出顺序混乱
第二,三句:解除cin和cout的绑定。在默认情况下,cin 是和 cout 绑定在一起的,即:在执行 cin 操作之前,会先刷新 cout 的缓冲区,以确保输出的内容都被显示出来。
三,缺省参数
缺省参数(Default Arguments)允许函数在定义时为某些参数指定默认值。如果调用函数时没有为这些参数提供实参,则使用默认值。
1. 缺省参数的基本用法
1.1. 语法
返回值类型 函数名(参数类型 参数名 = 默认值);
2.2. 示例
#include <iostream>// 函数声明,带有缺省参数
void printMessage(std::string message = "Hello, World!");int main() {printMessage(); // 使用默认参数,输出: Hello, World!printMessage("Hi!"); // 提供自定义参数,输出:Hi!return 0;
}// 函数定义
void printMessage(std::string message) {std::cout << message << std::endl;
}
2. 缺省参数的规则
2.1. 从右向左设置缺省参数
- 缺省参数必须从右向左依次设置,不能跳过中间的参数。
- 示例:
void func(int a, int b = 10, int c = 20); // 正确 void func(int a = 5, int b, int c = 20); // 错误:b 没有默认值
2.2. 函数声明和定义
- 如果函数在声明时指定了缺省参数,定义时不能再重复指定。
- 示例:
// 声明时指定缺省参数 void printNumber(int num = 42);// 定义时不能重复指定,即: 这里不能再写int num = 30 void printNumber(int num) {std::cout << num << std::endl; }
2.3. 调用时的参数匹配
- 如果提供了实参,则使用实参;否则使用默认值。
- 必须从左到右依次给实参,不能跳跃给实参
- 示例:
void printSum(int a, int b = 10, int c = 20) {std::cout << "Sum: " << a + b + c << std::endl; }int main() {printSum(1); // 输出:Sum: 31 (1 + 10 + 20)printSum(1, 2); // 输出:Sum: 23 (1 + 2 + 20)printSum(1, 2, 3); // 输出:Sum: 6 (1 + 2 + 3)return 0; }
2.4. 默认值必须是常量或全局变量
- 默认值不能是局部变量或动态计算的值。
- 示例:
int defaultValue = 10; void func(int a = defaultValue); // 正确 void func(int a = rand()); // 错误:默认值不能是动态计算的值
四,函数重载
函数重载(Function Overloading) 是C++中的一种特性,允许在同一个作用域内定义多个同名函数,但这些函数的参数列表必须不同(参数的类型、数量或顺序不同)。
1. 函数重载的基本规则
1.1. 参数列表必须不同
- 函数重载的核心是参数列表的不同。参数列表的不同可以体现在:
- 参数的类型不同。
- 参数的数量不同。
- 参数的顺序不同(如果类型不同)。
- 注意:返回值类型不同不能作为函数重载的依据。
1.2. 示例
下面共五个重载
#include <iostream>void print(int a) {std::cout << "Printing int: " << a << std::endl;
}void print(double a) { // 类型不同std::cout << "Printing double: " << a << std::endl;
}void print(int a, int b) { // 数量不同std::cout << "Printing two ints: " << a << ", " << b << std::endl;
}// 下面两者为顺序不同
void print(int a, char c) { std::cout << "Printing int: " << a << ' ' << "Printing char: " << c << std::endl;
}void print(char c, int a) { std::cout << "Printing int: " << a << ' '<< "Printing char: " << c << std::endl;
}int main() {print(10); // 调用 void print(int a)print(3.14); // 调用 void print(double a)print(10, 20); // 调用 void print(int a, int b)print(10, 'c'); // 调用 void print(int a, char c)print('d', 10); // 调用 void print(char c, int a)return 0;
}
输出:
Printing int: 10
Printing double: 3.14
Printing two ints: 10, 20
Printing int: 10 Printing char: c
Printing int: 10 Printing char: d
1.3. 避免歧义调用
-
示例一:
void func(int a, double b = 3.14); void func(int a);func(10); // 错误:调用歧义,无法确定调用哪个函数 -
示例二:
void func(int a = 3, double b = 3.14);
void func(int a, double b, int c);func(10); // 歧义:因为第一个func可接受参数数量:[0,2],第二个func可接受参数数量 3 编译器无法判断是错误的调用了第二个还是正确的调用了第一个
func(); // 会调用第一个,因为没参数,编译器可判断
func(10, 2.1, 5); // 会调用第二个,因为传入了三个参数
尽量避免写容易歧义的函数重载,在调用时也要判断重载的函数是否有歧义。
最后推荐几个个C++参考文档
1,非官方,按头文件分类:https://legacy.cplusplus.com/reference/
2,官方中文:https://zh.cppreference.com/w/cpp
3,官方英文:https://en.cppreference.com/w/
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!
相关文章:
快速从C过度C++(一):namespace,C++的输入和输出,缺省参数,函数重载
📝前言: 本文章适合有一定C语言编程基础的读者浏览,主要介绍从C语言到C过度,我们首先要掌握的一些基础知识,以便于我们快速进入C的学习,为后面的学习打下基础。 这篇文章的主要内容有: 1&#x…...
课程《Deep Learning Specialization》
在coursera上,Deep Learning Specialization 课程内容如下图所示:...
微服务与消息队列RabbitMQ
简介 同步模式 异步模式 内容 解决方案RabbitMQ 同步调用的优缺点 同步调用的优势是什么? 时效性强,等待到结果后才返回。 同步调用的问题是什么? 拓展性差性能下降级联失败问题...
苹果 M3 Ultra 芯片深度解析:AI 时代的性能革命
2025 年 3 月 5 日,苹果正式发布了其史上最强 PC 芯片 ——M3 Ultra。这款基于 UltraFusion 封装技术的旗舰级 SoC,不仅延续了苹果芯片在能效比上的传统优势,更通过架构创新与硬件升级,将 AI 计算能力推向了新高度。本文将从性能突…...
通义千问:Qwen2.5-0.5B模型架构解释
通义千问:Qwen2.5-0.5B模型架构解释 1. 模型权重文件 .mdl、.msc:存储模型核心参数,是模型训练后学习到的知识载体,包含神经网络各层权重,加载后模型才能执行推理、生成等任务。 .mdl文件:通常是模型的核心权重数据文件,存储神经网络各层的权重参数、张量等关键数据,是…...
安装完flash-attn,使用时报错undefined symbol
去flash attention官网下载安装包, 注意需要根据自己的torch版本,cuda版本(可以选择低于自己cuda版本的) 和python版本进行选择。 如果whl文件名上包含参数abiTRUE,则会报错。需要安装包含abiFALSE的whl文件。 卸载:卸载原先报错的flash-attn pip uni…...
【Linux】冯诺依曼体系与操作系统理解
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、冯诺依曼体系结构 二、操作系统 1. 操作系统的概念 2. 操作系统存在的意义 3. 操作系统的管理方式 4. 补充:理解系统调用…...
玩转ChatGPT:GPT 深入研究功能
一、写在前面 民间总结: 理科看Claude 3.7 Sonnet 文科看DeepSeek-R1 那么,ChatGPT呢? 看Deep Research(深入研究)功能。 对于科研狗来说,在这个文章爆炸的时代,如何利用AI准确、高效地收…...
虚函数和虚表的原理是什么?
虚函数是一个使用virtual关键字声明的成员函数,在基类中声明虚函数,在子类中可以使用override重写该函数。虚函数根据指针或引用指向的实际对象调用,实现运行时的多态。 虚函数表(虚表)是一个用于存储虚函数地址的数组…...
laravel es 相关代码 ElasticSearch
来源: github <?phpnamespace App\Http\Controllers;use Elastic\Elasticsearch\ClientBuilder; use Illuminate\Support\Facades\DB;class ElasticSearch extends Controller {public $client null;public function __construct(){$this->client ClientB…...
字节跳动C++客户端开发实习生内推-抖音基础技术
智能手机爱好者和使用者,追求良好的用户体验; 具有良好的编程习惯,代码结构清晰,命名规范; 熟练掌握数据结构与算法、计算机网络、操作系统、编译原理等课程; 熟练掌握C/C/OC/Swift一种或多种语言ÿ…...
C语言_数据结构总结6:链式栈
纯c语言代码,不涉及C 顺序栈的实现,欢迎查看这篇文章:C语言_数据结构总结5:顺序栈-CSDN博客 0. 结构单元 #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct Linknode { ElemType…...
DQN(Deep Q - Network)原理举例说明
DQN(Deep Q - Network)原理举例说明 1. 基本概念回顾 DQN 结合了深度学习和 Q - learning 算法,用深度神经网络来近似 Q 值函数,解决传统 Q - learning 在处理高维状态空间时的局限性。Q 值表示在某个状态下采取某个动作所能获得的期望累积奖励。 以下是DQN和A3C的原理对…...
物联网-IoTivity:开源的物联网框架
IoTivity 是一个开源的物联网(IoT)框架,旨在为物联网设备提供互操作性、安全性和可扩展性。它由 Open Connectivity Foundation (OCF) 主导开发,遵循 OCF 的标准,致力于实现设备之间的无缝连接和通信。IoTivity 提供了一个统一的框架,支持设备发现、数据交换、设备管理和…...
基于DeepSeek的智慧医药系统(源码+部署教程)
运行环境 智慧医药系统运行环境如下: 前端: HTMLCSS后端:Java AIGCDeepseekIDE工具:IDEA技术栈:Springboot HTMLCSS MySQL 主要角色 智慧医药系统主要分为两个角色。 游客 尚未进行注册和登录。具备登录注册、…...
基于Linux系统的边缘智能终端(RK3568+EtherCAT+PCIe+4G+5G)
背景 现有产品基本都是传统的产品,比如之前写的RTU还有基于Linux系统的物联网采集终端都是传统意义的产品,大家做的都差不多,能拼的除了价格之外就是软硬件的基本功了,好的产品肯定是要经过时间的磨合的。没有任何人可以写出来没有…...
Java 线程池内部任务出异常后,如何知道是哪个线程出了异常?
你的回答(口语化,面试场景) 好的,这个问题需要结合线程池的异常处理机制来回答。 Java线程池内部任务抛出的异常默认会被“吞掉”,但可以通过以下方法定位具体线程的异常: 方法1:在任务代码中捕…...
热图回归(Heatmap Regression)
热图回归(Heatmap Regression)是一种常用于关键点估计任务的方法,特别是在人体姿态估计中。它的基本思想是通过生成热图来表示某个关键点在图像中出现的概率或强度。以下是热图回归的主要特点和工作原理: 主要特点 热图表示: 每个关键点对应一个热图,热图中的每个像素值…...
信奥赛CSP-J复赛集训(模拟算法专题)(6):P6352 [COCI 2007/2008 #3] CETIRI
信奥赛CSP-J复赛集训(模拟算法专题)(6):P6352 [COCI 2007/2008 #3] CETIRI 题目描述 你原本有 4 4 4 个数,它们从小到大排序后构成了等差数列。 但是现在丢失了一个数,并且其余的三个数的顺序…...
2025-03-09 学习记录--C/C++-PTA 习题11-1 输出月份英文名
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 裁判测试程序样例: #include <stdio.h>char *getmonth( int n );int main() {int n;char …...
spring IOC(实现原理)
文章目录 依赖注入控制反转相关Spring 框架的 Bean管理的配置文件方式实例化Bean的三种方式无参构造器实例化静态工厂方法实例化实例工厂方法实例化静态和动态对比 注解常用注解纯注解 其它问题为什么p 命名空间方式需要无参构造 依赖注入 **依赖注入(DI࿰…...
linux环保监测4G边缘网关:环境数据的可靠传输者
环保监测工控机,常被称为“环境数据采集器”或“环保数据终端”,是一种专门用于环境监测领域的工业计算机。它具备强大的数据处理能力、稳定的运行性能和多种接口,能够实时采集、处理和传输环境监测数据。这些数据包括空气质量、水质、噪声、…...
【哇! C++】类和对象(五) - 赋值运算符重载
目录 编辑 一、运算符重载 1.1 运算符重载概念 1.2 全局运算符重载 1.3 运算符重载为成员函数 二、赋值运算符重载的特性 2.1 赋值运算符重载需要注意的点 2.2 赋值运算符重载格式 2.2.1 传值返回 2.2.2 传引用返回 2.2.3 检查自己给自己赋值 三、赋值运算符重载的…...
基于单片机的风速报警装置设计
标题:基于单片机的风速报警装置设计 内容:1.摘要 本设计聚焦于基于单片机的风速报警装置,旨在解决传统风速监测缺乏实时报警功能的问题。采用单片机作为核心控制单元,结合风速传感器采集风速数据。经实验测试,该装置能准确测量 0 - 60m/s 范…...
Linux一键安装zsh终端美化插件
zsh应该是很多人第一个用的Linux终端美化软件 但是其安装略微复杂,让人有些困扰 所以我花了两天写了一键安装脚本,实测运行后直接安装好 适用于Ubuntu、Debian、Red Hat、macOS等系统 直接安装好zsh 以及常用插件 autojump 跳转插件 zsh-syntax-highlig…...
Docker部署Ragflow(完美解决502 bad gateway)
Docker快速启动Ragflow:Dev 系统准备 ubuntu server 24.04 CPU ≥ 4 cores (x86);RAM ≥ 16 GB;Disk ≥ 100 GB; 更新系统 sudo apt update 下载源码 git clone https://github.com/infiniflow/ragflow.git cd ragflow/docker # 切换稳定版本分支 git checkout -f v0.17.…...
C++ 算法竞赛STL以及常见模板
目录 STL /*═══════════════ Vector ═══════════════*/ /*════════════════ Pair ════════════════*/ /*══════════════ String ════════════════*/ /*══════════…...
前端数据模拟 Mock.js 学习笔记(附带详细)
前端数据模拟 Mock.js 学习笔记 在前端开发过程中,数据模拟是一项至关重要的环节。当后端接口尚未完成或者需要独立进行前端开发与测试时,Mock.js 能发挥巨大作用,它可以模拟各种数据场景,助力前端开发高效进行。 一、Mock.js 的…...
Web基础:HTML快速入门
HTML基础语法 HTML(超文本标记语言) 是用于创建网页内容的 标记语言,通过定义页面的 结构和内容 来告诉浏览器如何呈现网页。 超文本(Hypertext) 是一种通过 链接(Hyperlinks) 将不同文本、图像…...
学习一下Qt中的分裂器以及为什么要使用分裂器?
关于分裂器的使用和内容这篇文章写的很详细了[QT_043]Qt学习之分裂器(QSplitter)-CSDN博客 我就说一下为什么已经有布局器要还使用分裂器 在 Qt 中,布局时使用分裂器(QSplitter)主要有以下几个方面的好处ÿ…...
