C++学习——认识和与C的区别

news2025/1/30 15:57:27

目录

前言

一、什么是C++

二、C++关键字

三、与C语言不同的地方

3.1头文件

四、命名空间

4.1命名空间的概念写法

4.2命名空间的访问

4.3命名空间的嵌套

4.4命名空间在实际中的几种写法

五、输入输出

5.1cout

5.2endl

5.3cin

总结


前言

开启新的篇章,这里进行对C++的学习,本篇文章知识简单介绍一下C++,一点知识,以及和C的区别。


一、什么是C++

我们之前学过C语言,知道C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂一些的问题,需要高度的抽象和建模的时候,C语言不合适。所以C++就出现了。

C++(c plus plus)是一种计算机高级程序设计语言,由C语言扩展升级而产生,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。

C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计。 C++几乎可以创建任何类型的程序:游戏、设备驱动程序、HPC、云、桌面、嵌入式和移动应用等。 甚至用于其他编程语言的库和编译器也使用C++编写。

C++拥有计算机运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。

C++可见也非常的重要。经过了多年的修改和规定,语言一直在发展。

这里可以点击进去看最新的编程语言排名:编程语言排名 - HelloGitHub

这里是2025年1月最新的榜单,可见用的还是很多的。

二、C++关键字

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

asmdoifreturntrycontinue
autodoubleinlineshorttypedeffor
booldynamic_castintsignedtypeidpublic
breakelselongsizeoftypenamethrow
caseenummutablestaticunionwchar_t
catchexplicitnamespacestatic_castunsigneddefault
charexportnewstructusingfriend
classexternoperatorswitchvirtualregister
constfalseprivatetemplatevoidtrue
const_castfloatprotectedthisvolatilewhile
deletegotoreinterpret_cast

这些关键字我们可以看看熟悉熟悉,可以看到大多数我们在学C的时候看见过。所以C++与C语言完全兼容,C语言的绝大部分内容可以直接用于C++的程序设计,用C语言编写的程序可以不加修改地用于C++。

三、与C语言不同的地方

3.1头文件

我们知道,C语言的头文件大多数都是stdio.h,或者其它的,而C++则是用iostream,注意,这里是没有.h后缀的,因为早在以前的时候,有一些编译器是可以用.h的,例如VC6.0(因为它没有命名空间),但后来命名空间的出现,这里就规定把.h去掉了,因为这样可以更好的与C语言区分开。

四、命名空间

4.1命名空间的概念写法

在C语言中我们可以知道命名冲突是一个很大的问题,在C/C++中,变量、函数和类是大量存在的,这些变量、函数和类的名称都将存在于全局变量中,可能会导致非常多的冲突。

这里就可以使用命名空间对标识符的名称进行本地化,以避免命名冲突或名字污染,namespce关键字就是解决这类问题的。

我们知道一段代码里有不同的域,例如类域,变量域,常量域,类域,还有命名空间域。

namespace n1
{
	int rand = 1;
}

这里就命名了一个n1的域,可以想象这是一个小块,这里面有一个整形变量rand赋值为1。我们知道rand是一个函数,但为什么没有报错命名冲突呢,因为这里它是在n1的域里的,并不是全局域里的,所以不会发生冲突。注意这里大括号外面没有分号了。

4.2命名空间的访问

首先,我们先看一下这个代码:

int a = 0;//全局域

int main()
{
	int a = 10;//局部域
	printf("%d\n", a);
	return 0;
}

我们之前学过,这里如果调用a这个变量,它是会是局部域,也就是最后打印的结果是10。但是如果我们想要也打印出来全局域的a变量该怎么写。

这里就会用到一个符号:::(双冒号)

双冒号::是一个作用域解析运算符(scope resolution operator),用于指定命名空间、类、结构体、枚举等的作用域。

如果也要打印全局变量的a,我们就可以写成:

int a = 0;//全局域

int main()
{
	int a = 10;//局部域
	printf("%d\n", a);
	printf("%d\n", ::a);//::左边是空白代表去全局域访问
	return 0;
}

::左边要是空白的话,那就代表着全局域。

这里运行一下我们可以看见:

运行成功,和我们的想法一致,如果我们加上了之前的命名空间,并把之前的rand变为a,我们该如何访问这个命名空间里的a呢?我们依旧可以用爽冒号来实现这一效果:


namespace n1
{
    int a=9;
}

int a = 0;//全局域

int main()
{
	int a = 10;//局部域
	printf("%d\n", a);
	printf("%d\n", n1::a);
	return 0;
}

可以看见访问成功了,这个的意义其实就是可以通过命名空间来防止大项目里的命名冲突。这里如果我们把命名空间打开了会怎么样。命名空间打开时用:

using namespace +之前命名空间的名字;

所以我们把刚刚的代码修改一下,命名空间打开:

namespace n1
{
	int a = 9;
}
using namespace n1;

int a = 0;//全局域

int main()
{
	int a = 10;//局部域
	printf("%d\n", a);
	printf("%d\n", n1::a);
	return 0;
}

这里就把命名空间打开了。这时候运行:

也是可以的,这里看不出什么,依旧是局部变量先访问,命名空间也可以访问。我们把主函数里修改就输出一个a,看看会发生什么?

namespace n1
{
	int a = 9;
}
using namespace n1;

int a = 0;//全局域

int main()
{
	int a = 10;//局部域
	printf("%d\n", a);
	return 0;
}

我们发现这里a输出的是10,所以如果把命名空间打开,那么命名空间里的就相当于全局域。

我们不妨可以试一试,输出全局域的,程序会怎么样:

namespace n1
{
	int a = 9;
}
using namespace n1;

int a = 0;//全局域

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

运行一下就会发生报错:

a不明确,也就发生了冲突。所以在使用命名空间打开的时候,要注意。

正常是局部域->全局域->不会主动去命名空间搜索,需要指定或者展开

4.3命名空间的嵌套

当然,命名空间也可以进行嵌套。但这里我们主要了解的是嵌套的意义和使用访问方法。

namespace N1
{
	int i = 0;
	namespace N2
	{
		int i = 2;
	}
}

这就是一个嵌套的命名空间,我们如果想要访问这两个i,给它打印到屏幕上该怎么写呢?

这里还是会用到双冒号:

int main()
{
	//嵌套访问
	printf("%d\n", N1::i);
	printf("%d\n", N1::N2::i);
	return 0;
}

这样就访问到了,代表N1中的i和N1中N2里的i。这样做有什么作用呢?

  1. 组织代码:嵌套命名空间可以将相关的代码组织在一起,使得代码更加清晰和结构化。例如,可以将与图形相关的类和函数放在一个命名空间内,将与网络相关的类和函数放在另一个命名空间内。

  2. 避免命名冲突:通过在不同的命名空间中使用相同的名称,可以避免命名冲突。例如,如果有两个模块都定义了一个名为"Utils"的命名空间,那么它们可以通过嵌套命名空间来解决冲突,如"Module1::Utils"和"Module2::Utils"。

  3. 提供更好的可扩展性:通过嵌套命名空间,可以将代码组织成多层次的结构,从而提供更好的可扩展性。例如,可以在一个命名空间内创建多个子命名空间,每个子命名空间代表不同的功能模块或组件。

  4. 提供更好的封装性:嵌套命名空间可以将代码隐藏在一个命名空间内,从而提供更好的封装性。只有在需要的时候才会引用外部命名空间的内容,减少了全局命名空间的污染。

总的来说,嵌套命名空间可以提供更好的代码组织、封装和可维护性,避免命名冲突,并提供更好的可扩展性。它是一种良好的编程实践,特别适用于大型项目和团队协作。

4.4命名空间在实际中的几种写法

1.假如我们要使用std命名空间,如果我们要在项目中使用命名空间,就尽量最好不要打开,因为一旦打开后,你不知道会发生什么,会和哪一个冲突,这样很不方便而且很头疼,最好是不用打开。就类似下面的:

using namespace std;

展开了std命名空间,编译器就可以进行搜索,推荐这么写,后续就可以不加了,但直接展开会有风险,如果定义和库重名就报错了,建议项目里不要这么写。

平时我们练习代码可以这么写,因为比较方便。

2.我们可以用到库的时候,再用双冒号来写:

std::cout

但是假如我们要写成千上万个呢,那就非常麻烦了。

3.所以我们可以把常用的在前面展开,不把整个命名空间展开:

using std::cout;
using std::endl;

这样后续我们就可以用cout和endl了,就不需要进行用双冒号了,冲突问题就大大的减小了。

五、输入输出

5.1cout

插入流运算符,cout就相当于c语言中的打印,这里也就是输出,我们可以直接用代码进行演示,非常的简单:

#include<iostream>
using std::cout;//流插入运算符,连续一样插入多个东西,不用指定类型,自动识别类型
using std::endl;//等价于换行符
int main()
{
	cout << "hello world" << endl;
	return 0;
}

这里cout<<后面直接加上自己想要输出的东西,它有一个优点,就是它可以自动识别类型,完了输出类型,但是当它输出小数的时候,只会输出一位小数,如果我们想要设置小数的宽度,建议直接使用C语言的设定宽度,因为c++里的有点难用。因为c++包含了c,所以c里的东西c++也可以使用,我们可以穿插着来写。

如果输出多个,可以这么写:

int main()
{
	int a = 3;
	cout << "hello world" << " " << a << endl;
	return 0;
}

5.2endl

这里理解为c++里的换行,和C语言里的'\n'是一样的效果。

5.3cin

流提取运算符,这里就是和C语言中的scanf一样,但是使用比C要简单:

#include<iostream>
using std::cin;//流提取运算符
using std::cout;//流插入运算符,连续一样插入多个东西,不用指定类型,自动识别类型
using std::endl;//等价于换行符
int main()
{
	int x = 0;
	cin >> x;
	cout << "hello world" << endl;
	cout << "hello world" << x << endl;
	return 0;
}

这里就用了这三个,会用就可以,不用深入了解。等到精通的时候可以考虑深入了解实现。


总结

今天主要就是C++的认识初始。

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

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

相关文章

基于Django的豆瓣影视剧推荐系统的设计与实现

【Django】基于Django的豆瓣影视剧推荐系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用了Python作为后端开发语言&#xff0c;采用Django作为后端架构&#xff0c;结…

Open FPV VTX开源之ardupilot双OSD配置摄像头

Open FPV VTX开源之ardupilot双OSD配置 1 源由2. 分析3. 配置4. 解决办法5. 参考资料 1 源由 鉴于笔者这台Mark4 Copter已经具备一定的历史&#xff0c;目前机载了两个FPV摄像头&#xff1a; 模拟摄像头数字摄像头(OpenIPC) 测试场景&#xff1a; 从稳定性的角度&#xff1…

【岛屿个数——BFS / DFS,“外海”】

题目 推荐阅读 AcWing 4959. 岛屿个数&#xff08;两种解法&#xff0c;通俗解释&#xff09; - AcWing 1.岛屿个数 - 蓝桥云课 (lanqiao.cn) 代码 #include <bits/stdc.h> using namespace std; #define x first #define y second int dx4[4] {-1, 0, 1, 0}, dy4[4] …

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器&#xff0c;算是比较的基础容器&#xff0c;也是大家在日常开发中常用到的容器&#xff0c;因为底层用到的数据结构比较简单&#xff0c;笔者就将他们三者放到一起做下对比分析&#xff0c;介绍下基本用法&a…

基于Flask的豆瓣电影可视化系统的设计与实现

【FLask】基于Flask的豆瓣电影可视化系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 随着互联网技术的飞速发展&#xff0c;影视剧行业的数据量呈爆炸性增长&#xff0c;其中影…

LosslessScaling-学习版[steam价值30元的游戏无损放大/补帧工具]

LosslessScaling 链接&#xff1a;https://pan.xunlei.com/s/VOHc-yZBgwBOoqtdZAv114ZTA1?pwdxiih# 解压后运行"A-绿化-解压后运行我.cmd"

【JS|第28期】new Event():前端事件处理的利器

日期&#xff1a;2025年1月24日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

Blazor-Blazor Web App项目结构

让我们还是从创建项目开始&#xff0c;来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式&#xff0c;有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…

观察者模式和订阅发布模式

有人把观察者模式等同于发布订阅模式&#xff0c;也有人认为这两种模式存在差异&#xff0c;本质上就是调度的方法不同。 相比较&#xff0c;发布订阅将发布者和观察者之间解耦。&#xff08;发布订阅有调度中心处理&#xff09;

16【中文编程10年内或将占领国内应用市场】

这同样是一篇较为犀利的文章&#xff0c;看过我分析辩论性文章的都知道&#xff0c;角度犀利&#xff0c;与大多数人观点不同&#xff0c;这是因为大多数人赞同的观点&#xff0c;我觉得我也没必要再去探讨了 回归正题&#xff0c;在大多数人眼中中文编程的代表就是易语言&…

Niagara学习笔记

橙色 发射器 , 绿色 粒子, 红色 渲染器 Emitter State 发射器状态 Life Cycle Mode&#xff08;生命周期模式&#xff09; 选择Self就是发射器自身管理生命周期 Loop Behavior 决定粒子发射次数 一次&#xff08;Once&#xff09;&#xff1a;发射器只播放一次多次&#…

Linux(NTP配置)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; NTP环境搭建 服务端客户端192.168.111.10192.168.111.11Linux MySQL5.7 3.10.0-1160.el7.x86_…

具身智能体俯视全局的导航策略!TopV-Nav: 解锁多模态语言模型在零样本目标导航中的顶视空间推理潜力

作者&#xff1a;Linqing Zhong, Chen Gao, Zihan Ding, Yue Liao, Si Liu 单位&#xff1a;北京航空航天大学&#xff0c;新加坡国立大学&#xff0c;香港中文大学多模态实验室 论文标题&#xff1a;TopV-Nav: Unlocking the Top-View Spatial Reasoning Potential of MLLM …

可以称之为“yyds”的物联网开源框架有哪几个?

有了物联网的发展&#xff0c;我们的生活似乎也变得更加“鲜活”、有趣、便捷&#xff0c;包具有科技感的。在物联网&#xff08;IoT&#xff09;领域中&#xff0c;也有许多优秀的开源框架支持设备连接、数据处理、云服务等&#xff0c;成为被用户们广泛认可的存在。以下给大家…

智能调度体系与自动驾驶技术优化运输配送效率的研究——兼论开源AI智能名片2+1链动模式S2B2C商城小程序的应用潜力

摘要&#xff1a;随着全球化和数字化进程的加速&#xff0c;消费者需求日益呈现出碎片化和个性化的趋势&#xff0c;这对物流运输行业提出了前所未有的挑战。传统的物流调度体系与调度方式已难以满足当前复杂多变的物流需求&#xff0c;因此&#xff0c;物流企业必须积极引入大…

图漾相机-ROS2-SDK-Ubuntu版本编译(新版本)

官网编译文档链接&#xff1a; https://doc.percipio.xyz/cam/latest/getstarted/sdk-ros2-compile.html 国内gitee下载SDK链接&#xff1a; https://gitee.com/percipioxyz 国外github下载SDK链接&#xff1a; https://github.com/percipioxyz 1.Camport ROS2 SDK 介绍 1.1 …

【Samba】Ubuntu20.04 Windows 共享文件夹

【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…

RAG是否被取代(缓存增强生成-CAG)吗?

引言&#xff1a; 本文深入研究一种名为缓存增强生成&#xff08;CAG&#xff09;的新技术如何工作并减少/消除检索增强生成&#xff08;RAG&#xff09;弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出&#xff0c;但是这样的工作方式很快就不能满足应用的需要: 因…

[MySQL]MySQL数据库的介绍和库相关操作

目录 一、数据库介绍 1.什么是数据库 2.为什么使用数据库 3.数据库的操作运行逻辑 4.MySQL架构 5.SQL语句的分类 二、数据库的操作 1.数据库的连接 2.数据库的操作 创建数据库 查看数据库 显示数据库的创建语句 删除数据库 修改数据库 3.字符集和校验集 查看系…

LLM幻觉(Hallucination)缓解技术综述与展望

LLMs 中的幻觉问题&#xff08;LLM 幻觉&#xff1a;现象剖析、影响与应对策略&#xff09;对其可靠性与实用性构成了严重威胁。幻觉现象表现为模型生成的内容与事实严重不符&#xff0c;在医疗、金融、法律等对准确性要求极高的关键领域&#xff0c;可能引发误导性后果&#x…