快速从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,按理说服务器是不知道你已经登陆了&…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
