C++入门——关键字|命名空间|输入输出

news2024/12/28 2:43:26

前言:

        今天我们又开启了一个崭新的大门——C++面向对象编程语言,C++是怎么来的呢?答案是:因为C语言的有很多不足,我们的祖师爷用着不爽,就不断更改,就改出来了一门新的语言,C++。C++语言兼容C语言,所以C的代码在C++中也可以使用。

目录:

1. C++关键字

2. 命名空间

3. C++输入&输出


0、本节知识点安排的目的

        C++是在C的基础上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习是有一定帮助的。本节主要目标:

        (1)补充C语言的语言不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面,IO方面,函数方面,指针方面,宏方面等。

        (2)为后续类和对象学习打基础。

一、C++关键字(C++98)

        C++总计63个关键字,C语言32个关键字。

        PS:下面我们只是看一下C++有哪些关键字,不对关键字进行具体的讲解,目前我们只需知道命名时要避开这些关键字。后面我们学到在细讲。

二、命名空间

         C++要解决的第一个问题就是命名冲突的问题。

        代码演示:我们定义一个全局变量,取名为rand。

#include<stdio.h>
#include<stdlib.h>//预处理,对rand的声明

int rand = 10;//定义变量rand

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

        当我们运行程序后,报错:C2365 “rand”:重定义;以前的定义是“函数”。

        我们知道,rand是stdlib.h这个头文件声明的一个函数,但是这里我又定义了一个变量rand,所以此时就发生了命名冲突。

总结:

        (1)可能发生命名冲突的类型:

1、我们跟库冲突 —— 在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,所以可能会导致很多冲突。

2、我们互相之间冲突 —— 在大型项目中,常常需要程序员互相分工合作完成,在命名的时候,难免可能会相同,所以可能会导致冲突。

        (2)那怎么解决命名冲突的问题呢?

        答案是:在C++中我们引入了namespace —— 命名空间。使用命名空间的目的就是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

1、命名空间定义

        关键字namespace是用来定义命名空间的,namespace后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。

        即定义出一个命名空间域,用命名空间域来隔离,解决命名冲突。

(1)域

1、同一个域不能定义同名的变量,不同域可以定义同名的变量。

2、域有的地方可以影响访问,有的地方可以影响生命周期。

3、局部域与全局域即影响访问,也影响生命周期。

4、访问变量时:编译器默认先局部找,找不到再去全局找。(都找不到就报错)

5、分类:有①局部域;②全局域;③命名空间域;④类域

讲解:

        ①访问变量时:编译器默认先局部找,找不到再去全局找。

#include<stdio.h>

int a = 10;//全局域

int main()
{
	int a = 0;//局部域

	printf("%d\n", a);//直接访问a,这里打印局部域的a

	//那我们想打印全局域的a,该怎么做呢?
	//答案是:使用 ::域作用限定符,指定方式:域名::变量名
	//全局作用域没有域名,所以 ::左边是空白就代表它去全局域访问
	printf("%d\n", ::a);
	return 0;
}

        运行结果:

说明:

1、编译器的访问顺序:局部 > 全局,找不到或命名冲突则报错

2、局部与全局都存在一个同名变量a时,想要访问全局的a —— 使用::域作用限制符。

3、域作用限制符的指定方式:域名::变量名

4、全局域没有域名,所以::左边是空白就代表它去全局域访问。 

(2)命名空间的定义讲解

        在上面我们那个代码中,rand发生了命名冲突的问题,我们现在使用namespace定义一个命名空间来解决命名冲突的问题。

        代码演示1:正常的命名空间定义

#include<stdio.h>
#include<stdlib.h>//#include包含头文件stdlib.h,在预处理指令时,它会打开指定的头文件,
				//并将其中的代码插入到包含该指令的源文件中,然后再进行编译。

namespace wjs
{
	int rand = 10;
}

int main()
{
	//直接访问rand:编译器是现在局部域找,找不到再去全局找,全局找不到就报错了。
	//要访问命名空间中的成员:
	//①展开命名空间域 —— 编译时是否去命名空间中搜索,即是将命名空间中声明的成员
	//暴露到当前作用域内可以直接使用(注意:并没有改变其所在的域)。
	//②指定访问命名空间域
	printf("%d\n", wjs::rand);
	return 0;
}

说明:

1、wjs命名空间的名字,一般开发中是用项目名字做命名空间名,平时练习大家可以用自己名字缩写即可。

2、命名空间的定义必须在全局域中。(因为命名空间就是在解决全局域中声明的名称与库里面的名称发生冲突的问题,所以命名空间的定义必须在全局域中)

3、编译器不能自动访问命名空间中的成员,想要访问必须:

        ①展开命名空间域 ——编译时去命名空间中搜索,即是将命名空间中声明的成员暴露到当前作用域内,可以直接使用(注意:并没有改变其所在的域)

        ②指定访问命名空间域

4、#include包含头文件stdlib.h —— 在预处理指令时,它会打开指定的头文件,并将其中的代码插入到包含该指令的源文件中,然后再进行编译。

5、头文件只是提供了这些名称的声明,让编译器知道他们的存在。

6、命名空间中可以定义变量、函数、类型。

        代码演示2:命名空间可以嵌套

#include<stdio.h>

namespace N1
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace N2
	{
		int c = 10;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}

int main()
{
	//访问N1中的a
	printf("%d\n", N1::a);
	//访问N2中的C
	printf("%d\n", N1::N2::c);
	return 0;
}

        代码演示3:同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成到同一个命名空间中。

        test.h文件:

namespace wjs
{
	int a = 10;
}

        test.cpp文件:

#include<stdio.h>
#include"test.h"

namespace wjs
{
	int rand = 10;
}

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

注意:一个命名空间就定义一个新的作用域,命名空间中的所有内容都局限于该命名空间中

2、命名空间的使用

        在前面我们已经知道,编译器不能自动访问命名空间中的成员。想要访问必须:

①展开命名空间域 ——编译时去命名空间中搜索,即是将命名空间中声明的成员暴露到当前作用域内,可以直接使用(注意:并没有改变其所在的域)。

②指定访问命名空间域。

        现在我们对其详细的讲解,把命名空间的使用分为三种方式

(1)加命名空间名称及作用域限定符

        适用于使用次数少的,代码演示:

//为什么C++标准库中的头文件都没有后缀名.h了?
//答案是:早期标准库将所有功能在在全局域中实现,声明在.h后缀的头文件中,
// 使用时只需包含对应头文件即可,后来C++标准引入了命名空间,
// 就把C++的标准库的定义实现都放到std这个命名空间中了,
// std是C++标准库的命名空间名。为了与C头文件作区分,也为了正确使用命名空间,
// 规定C++头文件不带.h。如C中有一个string.h的头文件,C++中也有一个string的头文件
#include<iostream>

int main()
{
	//编译器不能自动访问命名空间中的成员。
	//方式1:加命名空间名称及作用域限制符 —— 编译器直接去指定命名空间中搜索访问,
	//不会去局部域,全局域中搜索。
	std::cout << "hello world!" << std::endl;
	return 0;
}

说明:

1、命名空间名称::成员 —— 编译器直接去指定命名空间中搜索访问该成员,不会去局部域和全局域中搜索。

2、为什么C++标准库中的头文件都没有后缀名.h?

        答案是:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应的头文件即可(如老编译器VC 6.0还支持<iostream.h>),后来C++标准引入了命名空间,就把C++的标准库的定义实现都放在std这个命名空间中了,std是C++标准库的命名空间名。为了与C头文件作区分,也为了正确使用命名空间,规定C++头文件不带.h。如C中有一个string.h的头文件,C++中也有一个string的头文件。

3、在项目中我们常常使用指定命名空间的方法来访问成员。

(2)使用using将命名空间中的某个成员引入

        当使用次数多时,我们每一次都要指定命名空间,那也太麻烦了,这里我们可以展开常用的名称,就不用再每一次都指定命名空间了。

        代码演示:

#include<iostream>

using std::cout;//展开std中的cout
using std::endl;

int main()
{
	//下面cout,endl我们就可以不用每一次都指定命名空间std了
	cout << "hello world" << endl;
	cout << "hello world" << endl;
	cout << "hello world" << endl;
	return 0;
}

说明:

1、using 命名空间名::某个成员 —— 展开命名空间中的某个成员,编译时去命名空间中搜索,即将这个成员暴露到当前作用域,可以直接使用

2、当我们经常使用命名空间中的某个成员时,建议使用,因为展开常用的名称,就不用再每一次都指定命名空间了。

(3)使用using namespace 命名空间名称引入

        直接展开命名空间域,代码演示:

#include<iostream>

using namespace std;//展开命名空间

int main()
{
	//下面cout,endl我们就可以不用每一次都指定命名空间std了
	cout << "hello world" << endl;
	cout << "hello world" << endl;
	cout << "hello world" << endl;
	return 0;
}

说明:

1、展开命名空间域 ——编译时去命名空间中搜索,即是将命名空间中声明的成员暴露到当前作用域内,可以直接使用,所以直接展开会有风险,失去了命名空间的含义,我们定义的名称(如:变量名、函数名、类名)如果跟库重名,就报错了。

2、建议项目中不要去展开,日常练习我们可以为了方便可以去直接展开,项目中建议指定命名空间访问。

三、C++输入&输出

        代码演示:

#include<iostream>

using namespace std;//展开命名空间

int main()
{
	int a = 10;
	double b = 3.14;
	cout << a << endl;//输入a
	cout << b << '\n';//输出b
	cin >> a >> b;//输入a,b
	cout << a << " " << b << endl;//输出a 空格 b 
	return 0;
}

说明:

1、使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含<iostream>头文件以及按命名空间使用方法使用std。

2、cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在<iostream>头文件中。

3、<<流插入运算符,>>流提取运算符。(可以理解为流水的方向)

4、使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。

5、实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识,这些知识我们后续才会学习,所以我们这里只是简单学习他们的使用。

6、关于cout和cin还有很多更复杂的用法,比如控制浮点数输出精度,控制整形输出格式等等。因为C++兼容C语言的用法,我建议使用C的方法即可了因为C++相较于C格式复杂一些,有兴趣也可以去了解C++的。(总结:C++兼容C,哪个使用方便就使用哪个)

C++入门今天就先讲解了C++关键字、命名空间、输入&输出,后续持续讲解!

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

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

相关文章

黑客常用的十大工具(附工具安装包),你知道几款?

注&#xff1a;本文总结白帽黑客常用的十大工具。文档仅供参考&#xff0c;不得用于非法用途&#xff0c;否则后果自负。 1 Nmap nmap是一个网络连接端扫描软件&#xff0c;用来扫描网上电脑开放的网络连接端。确定哪些服务运行在哪些连接端&#xff0c;并且推断计算机运行哪个…

谈谈开源的利弊和国内的开源 ——《新程序员005:开源深度指南 新金融背后的科技力量》书评

感谢CSDN的送测 《新程序员005&#xff1a;开源深度指南 & 新金融背后的科技力量》 是一本以计算机编程和金融科技为主题的杂志书&#xff0c;由中国最大的开源社区之一的开源社主办&#xff0c;内容丰富多样&#xff0c;包括了众多知名开源项目和工具的介绍&#xff0c;同…

第 3 章:使用 Vue 脚手架

目录 具体步骤 模板项目的结构&#xff08;脚手架文件结构&#xff09; Vue脚手架报错 修改方案&#xff1a; 关于不同版本的Vue vue.config.js配置文件 ref属性 props配置项 mixin(混入) 插件 小结&#xff1a; scoped样式 小结&#xff1a; Todo-list 案例 小结…

kafka重点问题解答-----kafka 的设计架构

1. kafka 都有哪些特点&#xff1f; 高吞吐量&#xff0c;低延迟 可以热扩展 并发度高 具有容错性(挂的只剩1台也能正常跑) 可靠性高 2. 请简述你在哪些场景下会选择 kafka&#xff1f; kafka的一些应用 日志收集&#xff1a;一个公司可以用kafka可以收集各种服务的log&…

自学黑客(网络安全/web渗透),一般人我还是劝你算了吧

由于我之前写了不少网络安全技术相关的文章&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人私信问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f; 要学哪些东西&#xff1f; 有哪些方向&#xff1f; 怎么选&a…

chatgpt赋能python:Python分解三位数:打造高效的数学学习工具

Python分解三位数&#xff1a;打造高效的数学学习工具 介绍 Python是一种动态、解释型、高级编程语言&#xff0c;广泛应用于数据分析、人工智能、机器学习等领域。在数学教育中&#xff0c;Python也是一个非常好的工具&#xff0c;可以帮助学生更好地理解数学知识和提高解题…

Linux内核模块开发 第 6 章

The Linux Kernel Module Programming Guide Peter Jay Salzman, Michael Burian, Ori Pomerantz, Bob Mottram, Jim Huang译 断水客&#xff08;WaterCutter&#xff09; 6 字符设备驱动 include/linux/fs.h 中定义了结构体 file_operations &#xff0c;这个结构体包含指…

深度学习论文分享(三)Look More but Care Less in Video Recognition(NIPS2022)

深度学习论文分享&#xff08;三&#xff09;Look More but Care Less in Video Recognition&#xff08;NIPS2022&#xff09; 前言Abstract1. Introduction2 Related Work2.1 Video Recognition2.2 Redundancy in Data&#xff08;数据冗余&#xff09; 3 Methodology3.1 Arc…

Apache 虚拟主机企业应用

企业真实环境中&#xff0c; 一台服务器发布单个网站非常浪费资源&#xff0c;所以一台 web 服务器上会发布多个网站少则2~3个多则 30多个网站 在一台服务器上发布多网站&#xff0c;也称之为部署多个虚拟主机&#xff0c; Web 虚拟主机配置方法有以下 种&#xff1a; 1、基于单…

基于机器学习的内容推荐算法及其心理学、社会学影响闲谈

基于机器学习的内容推荐算法目前在各类内容类APP中使用的非常普遍。在购物、时尚、新闻咨询、学习等领域&#xff0c;根据用户的喜好&#xff0c;进行较为精准的用户画像与内容推荐。此类算法不但可以较为准确的分析用户的特征&#xff0c;如年龄、性别等&#xff0c;还能通过长…

QT项目实战(视频播放器)

文章目录 前言一、QMediaPlayer二、QVideoWidget三、QAudioOutput四、播放器代码实现五、最终效果总结 前言 本篇文章将使用QT6.4来实现一个简单视频播放器&#xff0c;在QT中使用一个视频播放器还是非常简单的。那么下面就让我们一起来实现这个视频播放器吧。 一、QMediaPla…

深度学习应用篇-计算机视觉-图像增广[1]:数据增广、图像混叠、图像剪裁类变化类等详解

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

基于VGG16实现宝石图像分类任务(acc 84%)--paddle paddle

作业&#xff1a;补充网络定义部分&#xff0c;使用卷积神经网络实现宝石分类 要求&#xff1a;1.补充完成CNN的网络结构定义方法实现宝石识别 2.可尝试不同网络结构、参数等力求达到更好的效果 卷积神经网络 卷积神经网络是提取图像特征的经典网络&#xff0c;其结构一般包…

【hello C++】类和对象(下)

目录 1. 再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2. static成员 2.1 概念 2.2 特性 3. 友元 3.1 友元函数 3.2 友元类 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象…

Spring Boot项目使用 jasypt 加密组件进行加密(例如:数据库、服务的Key、等等进行加密)

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

【018】C++的指针数组和数组指针

C 指针数组和数组指针 引言一、指针数组1.1、数值的指针数组1.2、字符的指针数组1.3、二维字符数组 二、指针的指针三、数组指针3.1、数组首元素地址和数组首地址3.2、数组指针的使用示例3.3、二维数组和数组指针的关系 四、多维数组的物理存储总结 引言 &#x1f4a1; 作者简介…

从0实现基于Alpha zero的中国象棋AI(会分为多个博客,此处讲解蒙特卡洛树搜索)

从0实现基于Alpha zero的中国象棋AI 0.0、前言 ​ 题主对于阿尔法狗的实现原理好奇&#xff0c;加上毕业在即&#xff0c;因此选择中国象棋版的阿尔法zero&#xff0c;阿尔法zero是阿尔法狗的升级版。在完成代码编写的历程中&#xff0c;深刻感受到深度学习环境的恶劣&#x…

零门槛快速创业:GPT和AI工具的秘密武器

在不到一周的时间里&#xff0c;David创建了一个按需印刷的Etsy商店&#xff0c;该商店具有引人注目的标识和大量独特的文字和艺术。 我最近花了大约一周的时间来建立Etsy店面。在本文中&#xff0c;我将向你展示我如何&#xff08;可能更有趣的是&#xff0c;在哪里&#xff…

YOLOv5:TensorRT加速YOLOv5模型推理

YOLOv5&#xff1a;TensorRT加速YOLOv5模型推理 前言前提条件相关介绍TensorRT加速YOLOv5模型推理YOLOv5项目官方源地址将训练好的YOLOv5模型权重转换成TensorRT引擎YOLOv5 best.pt推理测试TensorRT Engine推理测试小结 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&am…

笔试强训8

作者&#xff1a;爱塔居 专栏&#xff1a;笔试强训 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起进步 day13 一. 单选 1.下列关于视图的说法错误的是&#xff1a; A 视图是从一个或多个基本表导出的表&#xff0c;它是虚表B 视图一经定义就可以和基本表一样被查询…