【C++初阶】:C++入门篇(一)
文章目录
- 前言
- 一、C++命名空间
- 1.1 命名空间的定义
- 1.2 命名空间的使用
- 二、C++的输入和输出
- 2.1 cin和cout的使用
- 三、缺省参数
- 3.1 缺省参数的分类
- 四、函数重载
- 4.1 函数重载概念及其条件
- 4.2 C++支持函数重载原理 -- 名字修饰
前言
C++是在C语言的基础之上,增加了一些面向对象的编程思想,增加了一些有用的库,所以有了学习C语言的经验,学习C++其实很容易的。至于C++初阶,我们可以认为C++的出现其实就是为了弥补C语言在某些方面的不足之处。所以从这篇开始,一起来学习C++,以及C++到底弥补了C语言的哪些不足。
一、C++命名空间
学过C++的人都知道,在学习C++的过程中,比如在某些视频教程中,教我们写的第一个程序往往都是打印hello world,但是每次在写的过程中,老师们都叫我们去忽略一些东西,比如using namespace std; 那这句话到底有什么用呢?
无论是C语言还是C++,在同一个局部域里面是不允许出现相同的变量名的,在同一个作用域下定义了两个相同变量名的变量会导致访问冲突,编译器不知道该使用哪个变量,从而导致报错。不仅仅是变量名,函数名相同也是一样的(C++函数重载除外)。这也导致在一群人写同一个项目时,写完在合并之后可能导致函数名或变量名冲突的问题,为解决这个问题,C++的命名空间孕育而生。
命名空间的目的就是对标识符的名称进行本地化,避免命名冲突或名字污染,namespace关键字就是为了解决这样的问题。

1.1 命名空间的定义
定义命名空间时,需要用到namespace这个关键字,后面紧跟命名空间的名字,再接一队 {},{} 中为命名空间的成员。
一个命名空间就是定义了一个新的作用域,命名空间的所有内容都局限于这个命名空间中。
namespace N1 // 命名空间N1
{int a = 10;void test(){printf("test() a = 10\n");}
}namespace N2 // 命名空间N2
{int a = 20;void test(){printf("test() a = 20\n");}namespace N3 // 命名空间N3, 命名空间的嵌套{struct Node{struct Node* next;int data;};}
}
1.2 命名空间的使用
要使用命名空间的内容有三种方法,第一种就是命名空间名称加作用域限定符。
格式:命名空间名称::命名空间成员
int main()
{printf("%d\n", N1::a); // :: 是作用域限定符N1::test();printf("%d\n", N2::a);N2::test();N2::N3::Node node;node.data = 123;printf("%d\n", node.data);return 0;
}

方法二:使用using将某个命名空间的某个成员引入。
格式:using 命名空间名称::命名空间成员
using N1::a; //
using N2::N3::Node;
int main()
{printf("%d\n", a);printf("%d\n", N2::a);Node node;node.data = 456;printf("%d\n", node.data);return 0;
}

方法三:使用using namespace 命名空间名称引入。(不推荐)
格式:using namespace 命名空间名称;
using namespace N2;int main()
{printf("%d\n", a);test();printf("%d\n", N1::a);N1::test();N3::Node node;node.data = 789;printf("%d\n", node.data);return 0;
}

注意:使用 using namespace 命名空间名称; 就相当于破坏了作用域之间的封闭性,将命名空间中的成员全部暴露出来了。在日常练习中,建议直接using namespace std即可,这样就很方便。
了解完命名空间后,我们也算知道了为什么每次写C++程序时总要写一句using namespace std; std::是个名称空间标识符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准库中的函数或者对象都要用std来限定。
C++标准库,C++ Standard Library,是类库和函数的集合,其使用核心语言写成,由c++标准委员会制定,并不断维护更新。
using std::cout; // 分别将cout和endl释放出来
using std::endl;int main()
{cout << N1::a << endl;cout << N2::a << endl;N2::N3::Node node;node.data = 111;cout << node.data << endl;return 0;
}

二、C++的输入和输出
C++作为一门新的语言,不但可以兼容C语言,C++自己也有属于自己的独有语法,最典型的就是C++不仅可以使用C语言中的printf和scanf,也可以使用自己的输入输出语句,cout(输出) 和 cin(输入),这两个都是全局的流对象,endl是特殊的C++符号,表示换行。
cout标准输出对象(控制台)和cin标准输入对象(键盘)都必须包含iostream头文件以及按照命名空间使用方法使用std。
cout和cin分别是ostream和istream类型的对象,<< 和 >> 分别是流插入运算符和流提取运算符,实际是运算符重载过来的。
2.1 cin和cout的使用
#include<iostream>
using std::cout;
using std::cin;
using std::endl;int main()
{int a = 0;cin >> a; // cin和cout可以自动识别类型cout << a << endl;return 0;
}

三、缺省参数
缺省参数就是在给函数声明或定义时给函数的参数一个默认的值,在调用该函数时,如果没有给函数传递实参的话,该函数调用时就会采用该形参的缺省值,如果调用时传递了实参,就采用指定的实参。
void test1(int a = 20)
{cout << a << endl;
}int main()
{int a = 10;test1(); // 没有传参时,使用参数的默认值test1(a); // 有参数传递时,使用指定的实参return 0;
}

3.1 缺省参数的分类
- 全缺省参数
函数的每个参数都有自己的默认值,这样的参数就是全缺省参数。
void test2(int a = 10, int b = 20, int c = 30)
{}
- 半缺省参数
函数的部分参数有默认值,其余参数没有参数值。
void test3(int a, int b = 10, int c = 20)
{}
半缺省参数必须从右往左依次给,中间不能间隔,传参时也无法指定传参。另外,函数的缺省值不能再声明和定义中同时出现。那么,函数的缺省值是在函数的声明给还是在函数的定义时给呢?
其实只要我们仔细想一下就应该知道缺省值应该在函数的声明时给,因为函数往往都是先声明后使用,如果我们在声明函数时没有缺省值,但定义时又给了缺省值,就容易导致声明与定义不一致,另外,修改函数的声明比修改函数的定义要方便。
注意:函数的缺省值必须要是常量或则是全局变量,C语言不支持缺省参数其实就是C语言的编译器不支持。
四、函数重载
4.1 函数重载概念及其条件
自然语言中存在一词多义的现象,其意思需要人去结合上下文去判断,这就是词的重载,所以函数重载就是C++中允许同一个作用域中拥有功能相似的同名函数,同名函数之间的形参列表(形参类型、个数、类型顺序)不同,来处理一些功能类似数据类型不同的问题。
以下四个test01函数都构成函数重载。
// 参数个数不同
void test01()
{cout << "test01()" << endl;
}
// 参数类型不同
void test01(int a)
{cout << "test01(int a)" << endl;
}
// 参数类型顺序不同
void test01(int a, double b)
{cout << "test01(int a, double b)" << endl;
}void test01(double a, int b)
{cout << "test01(double a, int b)" << endl;
}
注意:函数的返回值不构成函数重载,因为只有返回值相同的话会造成调用歧义,编译器不知道该调用哪个函数,从而编译报错。
4.2 C++支持函数重载原理 – 名字修饰
C++为什么可以支持函数重载,而C语言为什么不可以支持?
学习C语言的时候,可以知道,一个程序要运行起来,需要经历四个阶段:预处理、编译、汇编、链接。

编译之后,会有一个符号表,函数会有自己的名字修饰,像Windows中VS的函数名修饰规则有点复杂,我们可以通过Linux下的gcc来查看函数名修饰规则。
在Linux下我们可以先用gcc编译一下C语言代码,然后通过objdump -S 可执行文件来查看这个汇编代码,从而看C语言下的函数名修饰规则。


通过汇编代码,可以看到C语言下函数名就是修饰后的名字。所以如果C语言中有两个名字相同的函数,那么修饰后的名字也是一样的,编译器不知道该调用哪一个,导致编译报错。
现在我们用g++去编译C++的代码,然后去看一下汇编后函数名会修饰成什么样子。


通过汇编代码可以看到C++不是单纯的用函数名进行修饰的,在函数名的前面加了一个 _Z 的前缀,函数名的后面是函数参数类型的缩写,id就表示该函数的参数类型是int和double类型,而di就表示该函数的参数类型是double和int类型,通过函数调用时传递的实参类型,决定调用哪一个函数。不会存在调用冲突的问题。
这也就是为什么C语言为什么不能支持函数重载的原因(同名函数编译后无法区分),而C++通过函数名修饰规则来区分,只要参数不一样,修饰出来的名字就不一样,也就支持了函数重载。
相关文章:
【C++初阶】:C++入门篇(一)
文章目录 前言一、C命名空间1.1 命名空间的定义1.2 命名空间的使用 二、C的输入和输出2.1 cin和cout的使用 三、缺省参数3.1 缺省参数的分类 四、函数重载4.1 函数重载概念及其条件4.2 C支持函数重载原理 -- 名字修饰 前言 C是在C语言的基础之上,增加了一些面向对象…...
【JAVA CORE_API】Day14 Collection、Iterator、增强for、泛型、List、Set
Collection接口及常用方法 Collection<Object> collection new ArrayList();:实例化ArrayList集合对象; collectionName.add(Object obj);:在集合中增加元素; int sizeName collectionName.size();:获取集合…...
Go更换国内源配置环境变量
背景 要在中国境内下载和使用Go编程语言的包,可以使用国内的Go模块代理来加速下载速度。以下是一些常见的国内Go模块代理源以及如何切换到这些源的方法: 常见国内Go模块代理源 七牛云(Qiniu) https://goproxy.cn 阿里云࿰…...
澎湃认证显实力,浪潮信息存储兼容新篇章
浪潮信息在存储技术兼容性领域取得新突破,其集中式存储HF/AS系列与长擎安全操作系统24强强联合,成功完成澎湃技术认证。此次合作不仅验证了双方产品的无缝对接能力,更体现了浪潮信息在推动全产业链共建共享方面的坚定决心。 浪潮信息澎湃技术…...
Leetcode 3255. Find the Power of K-Size Subarrays II
Leetcode 3255. Find the Power of K-Size Subarrays II 1. 解题思路2. 代码实现 题目链接:3255. Find the Power of K-Size Subarrays II 1. 解题思路 这一题是题目3254的进阶版,其实主要就是增加了算法复杂度。 整体上来说的话思路还是一个分段的思…...
Kotlin学习02-变量、常量、整数、浮点数、操作符、元组、包、导入
变量、常量、整数、浮点数、操作符、元组、包、导入 Book.kt package com.wujialiang.packclass Book {var title: String "Hello" }val PI 3.14; val E 2.178;Main.kt //引入包 //import com.wujialiang.pack.Book; import com.wujialiang.pack.*; //重命名导…...
C++的模板简介
文章目录 一、前言二、函数模板(Function Template)三、类模板(Class Template)四、变参模板(Variadic Template)五、模板的递归与元编程六、模板的局限与陷阱七、常用模板的实例八、C20 的概念(…...
树莓派5 笔记25:第一次启动与配置树莓派5_8G
今日继续学习树莓派5 8G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下: 今日购得了树莓派5_8G版本,性能是同运…...
Melittin 蜂毒肽;GIGAVLKVLT TGLPALISWI KRKRQQ
【Melittin 蜂毒肽 简介】 蜂毒肽(Melittin)是蜜蜂毒液中的主要活性成分,由26个氨基酸组成,具有强碱性,易溶于水,是已知抗炎性最强的物质之一。蜂毒肽具有多种生物学、药理学和毒理学作用,包括…...
day32
更新源 cd /etc/apt/ sudo cp sources.list sources.list.save 将原镜像备份 sudo vim sources.list 将原镜像修改成阿里源/清华源,如所述 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiver…...
【clickhouse】 使用 SQLAlchemy 连接 ClickHouse 数据库的完整指南
我听见有人猜 你是敌人潜伏的内线 和你相知多年 我确信对你的了解 你舍命救我画面 一一在眼前浮现 司空见惯了鲜血 你忘记你本是娇娆的红颜 感觉你我彼此都那么依恋 🎵 许嵩《内线》 ClickHouse 是一款非常高效的开源列式数据库,因…...
按键收集单击,双击和长按
按键收集单击,双击和长按 引言 在我们生活中, 按键是必不可少的, 不同的电器, 有不同的按键, 但是按键总有不够用的时候, 那么给与一个按键赋予不同的功能,就必不可少了. 一个按键可以通过按下的时间长短和频次, 来定义其类型。 一次按键收集, 都是在一个按键收集周…...
进程的异常终止
进程的异常终止 进程收到了某些信号,他杀 进程自己调用abort函数,产生了SIGABRT(6)信号,自杀 进程的最后一个线程收到了"取消"操作,并且做出响应 如果进程是异常结束的,atexit\on_exit它们事先注册的遗言…...
并发编程 | Future是如何优化程序性能
在初识Future一文中介绍了Future的核心方法。本文中接着介绍如何用Future优化我们的程序性能。 在此之前,有必要介绍Future接口的一个实现类FutureTask。 FutureTask介绍 FutureTask继承结构 首先我们看一下FutureTask的继承结构: public class Futur…...
Oracle笔记
一、 如何解决 sqlplus 无法使用退格键和方向键 .bashrc 中添加如下内容,解决 退格键 stty erase ^h 安装 rlwap 后,执行如下命令可解决 方向键 rlwap sqlplus 二、 都有哪些备份数据到工具 三、 谈谈 你对 oracle 中实例和数据库的理解 数据库是一…...
LVS+Keepalived 双机热备
LVSKeepalived 双机热备 Keepalived案例分析Keepalived工具介绍Keepalived工具介绍一、功能特点 一、理解Keepalived实现原理实验报告资源列表一、安装keepalived以及ipvsadm Keepalived案例分析 企业应用中,单台服务器承担应用存在单点故障的危险单点故障一旦发生…...
Web Image scr图片从后端API获取基本实现
因系统开发中需求,会有页面显示图片直接从后端获取后显示,代码如下: 后端: /*** 获取图片流* param response* param fileName*/RequestMapping(value"getImgStream",method RequestMethod.GET)public void getImgStr…...
2024音频剪辑指南:探索四大高效工具!
音频剪辑不仅仅是技术活,更是一种艺术创作,它能够让声音更加生动、更具感染力。今天,我们就来探索几款优秀的音频剪辑工具。 福昕音频剪辑 链接:www.pdf365.cn/foxit-clip/ 福昕音频剪辑是一款界面简洁、操作直观的音频编辑软件…...
“CSS”第一步——WEB开发系列13
CSS (Cascading Style Sheets,层叠样式表),是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言,CSS 文件扩展名为 .css。 一、什么是 CSS&a…...
IEEE802网络协议和标准
IEEE802网络协议和标准 802委员会IEEE 802介绍现有标准 IEEE 802.3介绍物理媒介类型MAC子层与LLC子层主要内容通讯标准POE供电标准802.3af、802.3at、802.3btIEEE802.3af的工作过程:IEEE802.3af主要供电参数:IEEE802.3af的分级参数:为什么会有…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...
LeetCode 0386.字典序排数:细心总结条件
【LetMeFly】386.字典序排数:细心总结条件 力扣题目链接:https://leetcode.cn/problems/lexicographical-numbers/ 给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。…...
