快速从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…...

PostgreSQL时间计算大全:从时间差到时区转换(保姆级教程)
一、时间计算的三大核心场景 当你遇到这些需求时,本文就是你的救星🌟: 倒计时功能:计算活动剩余天数 用户行为分析:统计操作间隔时间 跨国系统:多时区时间统一管理 报表生成:自动计算同比/环…...

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…...

题目 3220 ⭐因数计数⭐【数理基础】蓝桥杯2024年第十五届省赛
小蓝随手写出了含有 n n n 个正整数的数组 a 1 , a 2 , ⋅ ⋅ ⋅ , a n {a_1, a_2, , a_n} a1,a2,⋅⋅⋅,an ,他发现可以轻松地算出有多少个有序二元组 ( i , j ) (i, j) (i,j) 满足 a j a_j aj 是 a i a_i ai 的一个因数。因此他定义一个整数对 …...

【Java代码审计 | 第十一篇】SSRF漏洞成因及防范
未经许可,不得转载。 文章目录 SSRF漏洞成因Java中发送HTTP请求的函数1、HttpURLConnection2、HttpClient(Java 11)3、第三方库Request库漏洞示例OkHttpClient漏洞示例HttpClients漏洞示例 漏洞代码示例防范标准代码 SSRF SSRF(S…...

RabbitMQ高级特性--消息确认机制
目录 一、消息确认 1.消息确认机制 2.手动确认方法 二、代码示例 1. AcknowledgeMode.NONE 1.1 配置文件 1.2 生产者 1.3 消费者 1.4 运行程序 2.AcknowledgeMode.AUTO 3.AcknowledgeMode.MANUAL 一、消息确认 1.消息确认机制 生产者发送消息之后,到达消…...

C++复试笔记(一)
Setw 是C中用于设置输出字段宽度的函数。当使用 setw(3) 时,它会设置紧接着的输出字段的最小宽度为3个字符。如果字段内容长度小于3,则会在左侧填充空格以达到指定宽度;如果内容长度大于或等于3,则全部内容将被输出,…...

K8s 1.27.1 实战系列(四)验证集群及应用部署测试
一、验证集群可用性 1、检查节点 kubectl get nodes ------------------------------------------------------ NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 3h48m v1.27.1 k8s-node1 Ready <none> …...

基于Spring Boot的健美操评分管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

H5页面在移动端自动横屏
首先需要再head标签添加这样一段代码 <meta name="viewport" content="width=device-width,height=device-width,initial-scale=1.0,user-scalable=no">因为需求是为了满足WEB端和手机端都可以查看整体效果 但由于UI没有设计移动端的样式 所以我想说…...

【从0到1搞懂大模型】神经网络的实现:数据策略、模型调优与评估体系(3)
一、数据集的划分 (1)按一定比例划分为训练集和测试集 我们通常取8-2、7-3、6-4、5-5比例切分,直接将数据随机划分为训练集和测试集,然后使用训练集来生成模型,再用测试集来测试模型的正确率和误差,以验证…...

从0到1入门RabbitMQ
一、同步调用 优势:时效性强,等待到结果后才返回 缺点: 拓展性差性能下降级联失败问题 二、异步调用 优势: 耦合度低,拓展性强异步调用,无需等待,性能好故障隔离,下游服务故障不影响…...

MySQL数据库复杂的增删改查操作
在前面的文章中,我们主要学习了数据库的基础知识以及基本的增删改查的操作。接下去将以一个比较实际的公司数据库为例子,进行讲解一些较为复杂且现时需求的例子。 基础知识: 一文清晰梳理Mysql 数据库基础知识_字段变动如何梳理清楚-CSDN博…...

点云软件VeloView开发环境搭建与编译
官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程: 安装vs2019,windows sdk,qt5.14.2(没安装到5.15.7),git,cmake3.31,python3.7.9,ninja下载放到…...

本地YARN集群部署
请先完成HDFS的前置部署,部署方式可查看:本地部署HDFS集群https://blog.csdn.net/m0_73641796/article/details/145998092?spm1001.2014.3001.5502 部署说明 组件配置文件启动进程备注Hadoop HDFS需修改 需启动: NameNode作为主节点 DataNode作为从节点 Secondary…...

STM32常见外设的驱动示例和代码解析
以下是针对STM32常见外设的驱动示例和代码解析,基于HAL库实现,适用于大多数STM32系列(如F1/F4/H7等),可根据具体型号调整引脚和时钟配置。 1. GPIO驱动 应用场景:控制LED、按键检测、继电器开关等。 示例代码: // 初始化LED(推挽输出) void LED_Init(void) {GPIO_In…...

使用数据库和缓存的时候,是如何解决数据不一致的问题的?
1.缓存更新策略 1.1. 缓存旁路模式(Cache Aside) 在应用里负责管理缓存,读取时先查缓存,如果命中了则返回缓存,如果未命中就查询数据库,然后返回缓存,返回缓存的同时把数据给写入缓存中。更新…...

VS Code C++ 开发环境配置
VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…...

使用OpenCV和MediaPipe库——实现人体姿态检测
目录 准备工作如何在Windows系统中安装OpenCV和MediaPipe库? 安装Python 安装OpenCV 安装MediaPipe 验证安装 代码逻辑 整体代码 效果展示 准备工作如何在Windows系统中安装OpenCV和MediaPipe库? 安装Python 可以通过命令行运行python --versio…...

JWT的学习
1、HTTP无状态及解决方案 HTTP一种是无状态的协议,每次请求都是一次独立的请求,一次交互之后就是陌生人。 以CSDN为例,先登录一次,然后浏览器退出,这个时候在进入CSDN,按理说服务器是不知道你已经登陆了&…...

elasticsearch是哪家的
Elasticsearch:数据搜索与分析的领航者 在当今这个信息爆炸的时代,快速且准确地处理海量数据成为了众多企业和组织追求的目标。而Elasticsearch正是在这个背景下脱颖而出的一款强大的开源搜索引擎。它是由位于美国加利福尼亚州的Elastic公司所开发和维护…...

《A++ 敏捷开发》- 18 软件需求
需求并不是关于需求 (Requirements are not really about requirements) 大家去公共图书馆寄存物品,以前都是扫二维码开箱,有些图书馆升级了使用指纹识别。 “是否新方法比以前好?”我问年轻的开发人员。 “当然用指纹识别好。新技术&#x…...

计算机网络:计算机网络的组成和功能
计算机网络的组成: 计算机网络的工作方式: 计算机网络的逻辑功能; 总结: 计算机网络的功能: 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点(计算机或设备&…...

Upload-Labs-Linux 1-20
前端校验绕过:pass 01 两种思路:1.通过抓包,修改后缀 2.前端禁用js绕过前端后缀检验 首先写一个木马,改为图片格式GIF89a<?php eval($_POST[cmd])?>抓包之后改为PHP格式: 使用蚁剑连接木马,第一次尝…...

Compose笔记(八)--权限
这一节主要了解一下Compose中权限的申请,其中主要用到accompanist-permissions这个权限库,它是一个简化的Android Compose 中权限管理的库,如下使用: 栗子: 依赖添加 dependencies {implementation("com.google.accompani…...

单例模式:确保一个类只有一个实例
目录 引言 1. 单例模式的核心思想 2. 单例模式的实现方式 2.1 饿汉式单例 2.2 懒汉式单例 2.3 线程安全的懒汉式单例 2.4 双重检查锁定(Double-Checked Locking) 2.5 静态内部类实现单例 2.6 枚举实现单例 3. 单例模式的使用场景 4. 单例模式…...

推荐一个好用的在线文本对比网站 - diffchecker
推荐网址:https://www.diffchecker.com UI设计也很不错,响应也很快,广告少 生成的对比还可以生成在线链接:(点击右上角“分享”) 可设置过期时间等 我生成的示例:https://www.diffchecker.c…...

学习第八十五行
[capture](parameters) -> return_type {// function body }capture: 捕获列表,指定如何捕获周围作用域中的变量。parameters: 参数列表,与普通函数类似。return_type: 返回类型,可以省略,编译器会自动推断。function body: 函…...

基于Django创建一个WEB后端框架(DjangoRestFramework+MySQL)流程
一、Django项目初始化 1.创建Django项目 Django-admin startproject 项目名 2.安装 djangorestframework pip install djangorestframework 解释: Django REST Framework (DRF) 是基于 Django 框架的一个强大的 Web API 框架,提供了多种工具和库来构建 RESTf…...

【Python 2D绘图】Matplotlib绘图(统计图表)
【Python 2D绘图】Matplotlib绘图(统计图表) 1. 概述1.1 简介1.2 安装1.3 导入1.4 保存1.5 数据来源1.5.1 Numpy ndarray1.5.2 Pandas DataFrame 1.6 中文显示 2. 基础样式2.1 颜色2.1.1 简称2.1.2 全称 2.2 布局2.2.1 Matplotlib 画布划分2.2.2 绘制子图…...