C嘎嘎~~【初识C++ 上篇】

news2025/1/23 17:43:18

初识C++ 上篇

  • 🫅1. C++关键字
  • 🫅 2.命名空间
    • 🤷‍♂️2.1命名空间的定义
    • 🤷‍♂️2.2命名空间的使用
  • 🫅 3.C++输入 & 输出

转眼间, 就进入C++这个新的篇章啦!
我带着些许心悸 和 激动:
心悸的是, 时间过的是如此之快, 上个学期咋们还在一起谈着C语言, 数据结构, 现在又要一起学习C++啦; 心悸的是, 我在上个半年, 耽误了很多时间, 遗漏了许多博客没写。。。
激动的是, 我们终于要爽起来了, 相信我们在学习C++之后, 尤其是学习了C++的STL, 模板之后, 就不想写C语言了(当然, C语言也有自己的优势哎)


C++是在C语言的基础之上, 容纳进去了面向对象编程思想, 并增加了许多有用的库, 以及编程范式等等。

接下来, 我们初识C++(主要是C++98)章节的主要任务是:

  • 了解C语言语法的不足, 以及C++是如何对C语言设计不合理的地方进行优化的
  • 为后续的类和对象学习打基础

🫅1. C++关键字

  • C++ 总共有63 个 关键字, C语言有32个关键字。 在这个阶段, 我们对关键字只是起着了解作用, 以后碰到会进行详解的。

🫅 2.命名空间

应该不少萌新有些疑问: 啥是命名空间? 命名空间有啥用? 初学者有些疑问是一件好事, 我们可以带着疑问, 去有重点地学习。

让我们先来看看下面的一串代码:

#include<stdio.h>

int size = 4;
int size = 5;

int main()
{
	printf("%d\n", size);
	return 0;

}

*****
error : size 重定义
******

看到上面的代码, 有人就会说: 老陈, 你怎么写出这么挫的代码? 怎么定义了 size 两次?
嘿嘿一笑😀😀, 这么写有它的实际意义啊:你想啊, 你以后参加工作, 肯定是分项目给你和你的同事做啊, 最后把你们的代码合并起来。 如果最后你的代码中的变量名 和 张三的变量名 冲突了?怎么办?打一架、、、😀😀
这时候, 我们的祖师爷 - 本贾尼就想出了一个办法:能不能在每个人的代码之间起一堵 “墙” , 你的变量和函数 在你的区域内部起作用, 出了你的区域就不会起作用了。
这一堵墙的专业名词 就叫做 命名空间

  • 在C/C++中, 变量、函数 和 后面要学的类都是大量存在的, 这些变量、 函数 和 类的名称都存在于全局作用域中, 可能会导致许多冲突。 使用命名空间的目的是 对标识符的名称进行本地化, 以避免命名冲突 或 名字污染, namespace关键字的出现就是针对这种问题的


    那么问题来了: 这个namespace 是怎么用的?

🤷‍♂️2.1命名空间的定义

// 1.命名空间内可以定义变量, 函数, 类型
namespace mu
{
	int rand = 5;
	
	int Sub(int a, int b)
	{
		return a - b;
	}

}

// 2.命名空间可以嵌套
namespace N1
{
	int a;
	int b;

	struct SLTNode
	{
		int val;
		struct SLTNode* next;
	};

	namespace N2
	{
		int a;
		int b;

		struct SLTNode
		{
			int val;
			struct SLTNode* next;
		};

	}

}

// 3.同一个工程中允许多个相同的命名空间, 编译器最终会合并成一个命名空间中
// eg: 如果一个工程中, 存在着 test.cpp , CSDN.cpp 两个文件, 
// 这两个文件都存在着 N1 这个命名空间, 最终会合并成一个N1的命名空间

总结:

  1. 命名空间的构成: 关键字 namespace, 命名空间名(自己定), {}(注意跟结构体区分开, 后面没有 逗号 ;)
  2. 一个命名空间就定义了一个新的作用域(但是这个不影响生命周期),命名空间内的内容都局限于改命名空间中
  3. 命名空间的作用: 解决全局的命名冲突问题
    这里有人就会十万个为什么: 为什么不解决局限的命名冲突问题啊?
    首先, 我们都知道局部变量是不能重定义的, 它重定义 一是 语法问题, 二是 没啥用。
    其次, 我们应该明确,我们现在学的知识是为了后面的类、 对象学习打基础。 这些玩意都是存在于全局作用域中的, 解决的是他们的命名冲突问题

🤷‍♂️2.2命名空间的使用

学到这里, 有些人又有些疑问: 老陈, 我把我写的代码用命名空间包了起来, 那我们在工程中又怎么使用自己写的代码??
好问题! 这就是我们即将要讲的命名空间的使用。
系好安全带, 我们发车了!!🤞🤞

我们先了解一下编译器对域(墙)的搜索顺序:

那我们如何突破局部域 和 全局域 , 从而访问到我们的命名空间域呢??
一共有三种方式:

  1. 用作用域限定符(::)去访问
namespace N
{
	int a = 10;
	int b = 8;

	struct SLTNode
	{
		int val;
		struct SLTNode* next;

	};
}

int main()
{
	printf("%d\n", N::a);
	return 0;

}
  1. 使用 using 展开某命名空间的成员
namespace N
{
	int a = 10;
	int b = 8;

	struct SLTNode
	{
		int val;
		struct SLTNode* next;

	};
}

using N::b;

int main()
{

	printf("%d\n", b);

	return 0;

}
  1. 使用using namespace 展开某个命名空间域
namespace N
{
	int a = 10;
	int b = 8;

	struct SLTNode
	{
		int val;
		struct SLTNode* next;

	};
}

using namespace N;

int main()
{
	printf("%d\n", a);
	printf("%d\n", b);

	return 0;

}

总结一下上面的几种情形:

🫅 3.C++输入 & 输出

有些老铁, 到了这里就想问: 老陈, 我们搞了这么多东西, 还不知道 C++ 是如何输入 和 输出的?你这搞得不行啊, 赶快来讲一讲!!

由于C++ 兼容 C语言, 那么scanf 和 printf 还是照常能用的, 不过需要引用 头文件 cstdio , 不过好像在最新的C++语法里, 引用头文件 iostream 就能照用 这两个函数 。

#include<iostream>
// #include<cstdio>

int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d\n", a);

	return 0;

}

*****
5
5

*****

有些老铁又要问了: 那C++有么有自己专用的输入 和 输出 函数啊?cin 和 cout 就是你们要的答案
先别发问, 我先给你们看一下例子:

#include<iostream>

using namespace std;

int main()
{
	int n;
	cin >> n;
	cout << n << endl;

	return 0;
}

*****
5
5

*****

说明:

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。
  3. << 是流插入运算符,>> 是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
  5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有一个章节更深入的学习IO流用法及原理。
  • 注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因此推荐使用+std的方式。

🐉🐉🐉🐉🐉
std是C++标准库的命名空间,如何展开std使用更合理呢?

  1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
  2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。

自是汝才难用世,岂真吾相不当侯?
须知少日拏云志,曾许人间第一流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wing IDE 解决鼠标悬浮

Wing IDE 解决鼠标悬浮 通过修改文件配置&#xff0c;解决鼠标悬浮没有出现变量值和函数没有自动提示的问题。 配置文件路径查看&#xff1a; 打开该文件夹下的下图配置文件&#xff1a; 添加下图两行配置&#xff0c;然后重启wingide即可。 Wing IDE 常用快捷键 调节字…

【JS】Es6无法注销事件 | class构造函数里无法注销事件解决方法(亲测有效)

错误删除事件 class Goods {addEv() {// 添加mousemove事件// document.addEventListener(mousemove, this.changeEv.bind(document)) //错误一// document.addEventListener(mousemove, this.changeEv) //错误二document.addEventListener(mousemove, this.changeEv.bind(thi…

(数字图像处理MATLAB+Python)第五章图像增强-第一节:图像增强概述和基于灰度级变换的图像增强

文章目录 一&#xff1a;图像增强概述二&#xff1a;基于灰度级变换的图像增强&#xff08;1&#xff09;线性灰度级变换A&#xff1a;基本线性灰度级变换B&#xff1a;分段线性灰度级变换①&#xff1a;定义②&#xff1a;截取式灰度变换③&#xff1a;窗切片 &#xff08;2&a…

【权限维持】LinuxOpenSSHPAM后门SSH软链接公私钥登录

文章目录 权限维持-Linux-替换版本-OpenSSH后门拓展玩法&#xff1a;OpenSSH后门的防范方法 权限维持-Linux-更改验证-SSH-PAM后门配置环境 权限维持-Linux-登录方式-软链接&公私钥&新帐号SSH软链接公私钥后门帐号 参考 权限维持-Linux-替换版本-OpenSSH后门 这里复现…

java 获取时间的方法

Java的时间是通过字节码指令来控制的&#xff0c;所以 java程序的运行时间是通过字节码指令来控制的。但是由于 Java程序在运行时&#xff0c; JVM会产生一些状态&#xff0c;所以在执行 JVM指令时&#xff0c; JVM也会产生一些状态。 我们在执行 java程序时&#xff0c;主要是…

JVM(面试问题简析)学习笔记

文章目录 1. JVM中有哪几块内存区域&#xff1f;Java 8 之后对内存分代做了什么改进&#xff1f;2. 你知道JVM是如何运行起来的吗&#xff1f;堆内存中对象的分配的基本策略&#xff1f;3. 说说 JVM 在哪些情况下会触发垃圾回收&#xff1f;JVM 的年轻代垃圾回收算法&#xff1…

【杂凑算法篇】密码杂凑算法的安全强度

【杂凑算法篇】密码杂凑算法的安全强度 杂凑&#xff08;哈希&#xff09;算法安全强度—【蘇小沐】 文章目录 【杂凑算法篇】密码杂凑算法的安全强度&#xff08;一&#xff09;安全强度&#xff08;Security Strength)&#xff08;二&#xff09;杂凑算法的安全强度与对比总…

x86汇编

寄存器 常规 AX累加&#xff0c;算术运算或函数返回值存储 基址寄存器(BX)&#xff0c;指向数据的指针 计数寄存器CX&#xff0c;移位&#xff0c;循环&#xff0c;一些量 数据寄存器DX&#xff0c;运算超过16位&#xff0c;高16位放在DX 堆栈指针寄存器SP&#xff0c;用于指向…

系统设计访谈-业内人事指南 《System Design Interview-An insider‘s guide》中文版

前言&#xff1a; We are delighted that you have decided to join us in learning the system design interviews. System design interview questions are the most difficult to tackle among all the technical interviews. The questions require the interviewees to de…

(Qt) 重定向内置日志

文章目录 前言代码.pri 独立的包log.priLOG_Config.hppLOG.hLOG.cpp examplelog_test.promain.cpp 使用效果debug模式release模式 分析Qt内部结构核心函数核心配置 END 前言 在软件开发过程中&#xff0c;避免不了日志的使用。 在Qt中&#xff0c;我们平常用的#include <Q…

Django | 解决admin增加新用户只有用户名密码和确认密码的问题

文章目录 如图所示&#xff0c;下面给出解决方案&#xff1a; 如果您使用 使用 Django 默认的后台管理界面添加用户时&#xff0c;只看到了三个字段&#xff08;通常是 username、password和 repassword&#xff09;&#xff0c;那么可以通过定义 add_fieldsets 属性来增加更多…

Jenkins关联GitLab

1、Jenkins、GitLab服务器上面生成公钥、私钥 ssh-keygen -t ecdsa # 回车 指到没有交互式2、GitLab WEB端添加 刚刚生成的公钥 cat ~/.ssh/id_ecdsa.pub # 查看密钥登入gitlab > 右上角头像 > 偏好设置 > SSH秘钥 使用相同方法 添加Jenkins秘钥 3、Jenkins创建一…

Graph push pull

图数据的存储结构 键值对存储因具有可扩展强、结构简单、查找迅速等特点被广泛应用于图查询系统中&#xff0c;如Wukong、Trinity.RDF。在Wukong系统中&#xff0c;图上的边会转换成键值对进行存储&#xff0c;将顶点编号、边的类型、边的方向、值的地址和大小等信息组合成键&…

Bitmap 实现当前在线用户数量

Bitmap是什么&#xff1f; Bitmap是Redis中的一种数据结构&#xff0c;它是一个类似于位数组的数据结构&#xff0c;用于处理位数据。在Redis中&#xff0c;Bitmap是使用字符串来存储的&#xff0c;一个Byte可以存储8个二进制位&#xff0c;一个字符串可以存储232个二进制位&a…

成功解决:NLTK包的安装错误

成功解决NLTK包的安装错误 创建环境NLP_Pre_train l环境 conda create -n NLP_Pre_train python3.8激活 conda activate NLP_Pre_train安装NLTK&#xff0c;套用以下命令 pip install NLTK之后是验证NLTK是否安装成功&#xff0c;采用的步骤如下所示&#xff1a; import n…

认识Java文件操作和IO流

文件操作&#xff08;一&#xff09; 文章目录 文件操作&#xff08;一&#xff09;文件的特性路径文件分类File类的使用文件的创建文件的删除文件创建加目录创建列出当前文件夹包含的文件文件重命名函数 文件的特性 我们所说的文件一般指的是硬盘文件&#xff0c;其实文件不止…

Minio对象存储服务介绍、单机和集群部署及其使用

Minio对象存储服务介绍、单机和集群部署及其使用 前言Minio简介Minio版本选择AGPL协议说明Minio优缺点优点缺点 Minio分server 和clientminio-client下载二进制文件查看 mc 版本 Minio分布式集群详细搭建基础环境操作系统Minio下载 准备工作1、机器资源2、创建相关目录3、创建启…

IOC容器与DI依赖注入示例

IOC容器与DI依赖注入示例 IOC深入理解IOC示例&#xff1a; DI深入理解DI示例 IOC深入理解 我们先通过几个问题来加深一下对IOC的理解 (1)Spring是使用IOC容器来管理bean对象的&#xff0c;我们主要管理什么? 主要管理项目中所使用到的类对象&#xff0c;比如(Service层对像和…

哈希表|STL使用

哈希表 时间复杂度为O(1) 拉链法 把X代表的数字映射到N所在区间&#xff0c;有可能会发生冲突俩个或多个数字映射到1个数 拉链法&#xff1a;把冲突的数字挂起来&#xff0c;用单链表挂起来 一般取模的数要取成质数&#xff0c;而且这个质数离二的n次幂要比较远&#xff0c;这样…

什么是深度学习?

目录 简介 深度学习的由来 深度学习未来的趋势 总结 简介 深度学习是在20世纪80年代被提出来的&#xff0c;主要是由加拿大的计算机科学家Geoffrey Hinton、Yoshua Bengio、Yann LeCun等人发起的。Geoffrey Hinton等人在经过多年的研究和实践之后&#xff0c;…