快速从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,按理说服务器是不知道你已经登陆了&…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...
统计学(第8版)——统计抽样学习笔记(考试用)
一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征(均值、比率、总量)控制抽样误差与非抽样误差 解决的核心问题 在成本约束下,用少量样本准确推断总体特征量化估计结果的可靠性(置…...
uniapp获取当前位置和经纬度信息
1.1. 获取当前位置和经纬度信息(需要配置高的SDK) 调用uni-app官方API中的uni.chooseLocation(),即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...