当前位置: 首页 > news >正文

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

目录

前言

一、什么是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++的认识初始。

相关文章:

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

目录 前言 一、什么是C 二、C关键字 三、与C语言不同的地方 3.1头文件 四、命名空间 4.1命名空间的概念写法 4.2命名空间的访问 4.3命名空间的嵌套 4.4命名空间在实际中的几种写法 五、输入输出 5.1cout 5.2endl 5.3cin 总结 前言 开启新的篇章&#xff0c;这里…...

为AI聊天工具添加一个知识系统 之63 详细设计 之4:AI操作系统 之2 智能合约

本文要点 要点 AI操作系统处理的是 疑问&#xff08;信念问题&#xff09;、缺省&#xff08;逻辑问题&#xff09;和异常(不可控因素 ) 而 内核 的三大功能 &#xff08;资源分配/进程管理/任务调度&#xff09;以及外围的三类接口&#xff08; CLI、GUI和表面模型的 运行时…...

基于SpringBoot的网上摄影工作室开发与实现 | 含论文、任务书、选题表

随着互联网技术的不断发展&#xff0c;摄影爱好者们越来越需要一个在线平台来展示和分享他们的作品。基于SpringBoot的网上摄影工作室应运而生&#xff0c;它不仅为用户提供了一个展示摄影作品的平台&#xff0c;还为管理员提供了便捷的管理工具。本文幽络源将详细介绍该系统的…...

Flutter子页面向父组件传递数据方法

在 Flutter 中&#xff0c;如果父组件需要调用子组件的方法&#xff0c;可以通过以下几种方式实现。以下是常见的几种方法&#xff1a; 方法 1&#xff1a;使用 GlobalKey 和 State 调用子组件方法 这是最直接的方式&#xff0c;通过 GlobalKey 获取子组件的 State&#xff0c…...

回顾Maven

Maven Maven简介 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它 用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、 测试、打包和发布等工作。 管理jar包管理jar包之间的依赖关系&#xff08;其中一个jar包可能同时依赖多个…...

除了layui.js还有什么比较好的纯JS组件WEB UI?在谷歌浏览上显示

以下是一些比较好的纯JS组件WEB UI&#xff0c;可以在谷歌浏览器上良好显示&#xff1a; 1. Sencha 特点&#xff1a;提供超过140个高性能UI组件&#xff0c;用于构建现代应用程序。支持与Angular和React集成&#xff0c;提供企业级网格解决方案。 适用场景&#xff1a;适用于…...

力扣111二叉树的最小深度(DFS)

Problem: 111. 二叉树的最小深度 文章目录 题目描述思路复杂度Code 题目描述 思路 1.欲望求出最短的路径&#xff0c;先可以记录一个变量minDepth&#xff0c;同时记录每次当前节点所在的层数currentDepth 2.在递的过程中&#xff0c;每次递一层&#xff0c;也即使当前又往下走…...

c++学习第十三天

创作过程中难免有不足&#xff0c;若您发现本文内容有误&#xff0c;恳请不吝赐教。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、vector 1.介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空…...

zookeeper-3.8.3-基于ACL的访问控制

ZooKeeper基于ACL的访问控制 ZooKeeper 用ACL控制对znode的访问&#xff0c;类似UNIX文件权限&#xff0c;但无znode所有者概念&#xff0c;ACL指定ID及对应权限&#xff0c;且仅作用于特定znode&#xff0c;不递归。 ZooKeeper支持可插拔认证方案&#xff0c;ID格式为scheme…...

Java定时任务实现方案(四)——Spring Task

Spring Task 这篇笔记&#xff0c;我们要来介绍实现Java定时任务的第四个方案&#xff0c;使用Spring Task&#xff0c;以及该方案的优点和缺点。 ​ Spring Task是Spring框架提供的一个轻量级任务调度框架&#xff0c;用于简化任务调度的开放&#xff0c;通过注解或XML配置的…...

WGCLOUD运维工具从入门到精通 - 如何设置主题背景

需要升级到WGCLOUD的v3.5.7或者以上版本&#xff0c;才会支持自定义设置主题背景色 WGCLOUD下载&#xff1a;www.wgstart.com 我们登录后&#xff0c;在右上角点击如下的小图标&#xff0c;就可以设置主题背景色了&#xff0c;包括&#xff1a;经典白&#xff08;默认&#x…...

Babylon.js 中的 setHardwareScalingLevel和getHardwareScalingLevel:作用与配合修改内容

在 Babylon.js 中&#xff0c;Engine类提供了setHardwareScalingLevel和getHardwareScalingLevel方法&#xff0c;用于管理和调整渲染分辨率与屏幕分辨率的比例。这些方法在优化性能和提升画质方面非常有用。尤其是在某些平台不支持硬件反锯齿时&#xff0c;可以考虑使用setHar…...

Qwen2-VL:在任何分辨率下增强视觉语言模型对世界的感知 (大型视觉模型 核心技术 分享)

摘要 我们推出了Qwen2-VL系列,这是对之前Qwen-VL模型的高级升级,重新定义了视觉处理中的常规预设分辨率方法。Qwen2-VL引入了Naive Dynamic Resolution机制,使模型能够动态地将不同分辨率的图像转换为不同的视觉令牌数量。这种方法允许模型生成更高效和准确的视觉表示,紧密…...

Docker——入门介绍

目录 1.初识 Docker1.1.什么是 Docker1.1.1.应用部署的环境问题1.1.2.Docker 解决依赖兼容问题1.1.3.Docker 解决操作系统环境差异1.1.4.小结 1.2.Docker 和虚拟机的区别1.3.Docker 架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker 架构1.3.4.小结 1.4.安装 Docker1.4.1.概述…...

02数组+字符串+滑动窗口+前缀和与差分+双指针(D2_字符串(D2_刷题练习))

目录 1. 最长公共前缀 1.1. 题目描述 1.2. 解题方案 方案一&#xff1a;纵向对比 方案二&#xff1a;横向对比 方案三&#xff1a;最值对比 方案四&#xff1a;分治 方案五&#xff1a;二分 1.3. 知识归纳 2. 左旋转字符串&#xff08;简单&#xff09; 2.1. 题目描述…...

【redis进阶】集群 (Cluster)

目录 一、基本概念 二、数据分片算法 2.1 哈希求余 2.2 一致性哈希算法 3.3 哈希槽分区算法 (Redis 使用) 三、集群搭建 (基于 docker) 3.1 创建目录和配置 3.2 编写 docker-compose.yml 3.3 启动容器 3.4 构建集群 四、主节点宕机 4.1 处理流程 五、集群扩容 六、集群缩容 (选…...

Python案例--100到200的素数

一、问题描述 素数&#xff08;Prime Number&#xff09;是指在大于1的自然数中&#xff0c;除了1和它本身以外不再有其他因数的数。判断一个数是否为素数是计算机科学和数学中的一个经典问题。本实例的目标是找出101到200之间的所有素数&#xff0c;并统计它们的数量。 二、…...

C语言,无法正常释放char*的空间

问题描述 #include <stdio.h> #include <stdio.h>const int STRSIZR 10;int main() {char *str (char *)malloc(STRSIZR*sizeof(char));str "string";printf("%s\n", str);free(str); } 乍一看&#xff0c;这块代码没有什么问题。直接书写…...

重回C语言之老兵重装上阵(十五)C语言错误处理

C语言错误处理 在C语言中&#xff0c;错误处理是非常重要的一部分。C语言没有像高级语言&#xff08;例如Python、Java&#xff09;那样内建的异常处理机制&#xff08;如try-catch&#xff09;&#xff0c;但它提供了几种方法来捕捉和处理错误。正确的错误处理可以提高程序的稳…...

基于微信的课堂助手小程序设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...