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

C++基础篇(1)

目录

前言

1.第一个C++程序

2.命名空间

2.1概念理解

2.2namespace 的价值

2.3 namespace的定义

3.命名空间的使用

4.C++的输入输出

结束语


前言

本节我们将正式进入C++基础的学习,话不多说,直接上货!!!

1.第一个C++程序

首先,我们要了解C++的文件命名格式
C++兼容C语言绝大多数的语法,所以C语言实现的hello world依旧可以运行,C++中需要把定义文件代码后缀改为.cpp,vs编译器看到是.cpp就会调用C++编译器编译,linux下要用g++编译,不再是gcc。
// test.cpp
#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
当然C++有自己的输入输出方式,严格说C++版本的hello world应该是这样写的。(后续会讲到)
#include <iostream>
using namespace std;
int main() {cout << "hello world" << endl;return 0;
}

2.命名空间

2.1概念理解

在计算机科学中,命名空间是一种将一组符号名称(如变量名、函数名、类名等)绑定到特定作用域的上下文的方法,以避免名称冲突。在不同的编程语言中,命名空间可能以不同的形式存在,但基本概念是相似的。

在C++中,命名空间是一种组织代码的结构,它允许你将一组具有唯一名称的实体(如类、函数和变量)封装在一起,从而避免了全局命名空间的名称冲突问题。命名空间对于大型项目和库尤其有用,因为它们可以减少名称碰撞的可能性,并使代码更易于管理。

在C++中定义命名空间非常简单,使用namespace关键字后跟命名空间的名字。

要访问命名空间中的成员,可以使用作用域解析运算符::

故接下来介绍namespace

2.2namespace 的价值

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进⾏本地化,以免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的。
c语言项目类似下面程序这样的命名冲突是普遍存在的问题,C++引⼊namespace就是为了更好的解决这样的问题
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
// 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”
printf("%d\n", rand);
return 0;
}

C++使用namespace后:

#include <iostream>
#include <stdio.h>
namespace hu{int rand = 10;
}
int main()
{printf("%d\n", hu::rand);return 0;
}

4824e420f3a2455494c532f8fca96273.png

2.3 namespace的定义

在C++中,namespace(命名空间)是C++语言的一个核心特性,不属于任何特定的库。

1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
2.namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以rand不在冲突了。
3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期, 命名空间域和类域不影响变量生命周期。
代码展示
#include <stdio.h>
//#include <stdio.h>
#include <stdlib.h>
// hu是命名空间的名字,⼀般开发中是⽤项⽬名字做命名空间名
namespace hu{// 命名空间中可以定义变量/函数/类型int rand = 10;int  add(int x, int y) {return x + y;}//定义一个节点struct Node{struct Node* next;int val;};
}
int main()
{hu::Node* node = (hu::Node*)malloc(sizeof(hu::Node));node->val = 1;// 这⾥默认是访问的是全局的rand函数指针printf("%p\n", rand);// 这⾥指定hu命名空间中的randprintf("%d\n", hu::rand);printf("%d\n", hu::add(2, 3));printf("%d\n", node->val);return 0;
}
运行结果:
22324c10bcb14253bd32cd323a7362fb.png
namespace只能定义在全局,当然还可以嵌套定义。
代码展示
namespace HL{namespace H{int rand = 1;int Add(int left, int right){return left + right;}}namespace L{int rand = 2;int Add(int left, int right){return (left + right) * 10;}}
}
int main()
{printf("%d\n", HL::H::rand);printf("%d\n", HL::L::rand);printf("%d\n", HL::H::Add(1, 2));printf("%d\n", HL::L::Add(1, 2));return 0;
}
运行结果:
3194625548764450a138f2503996b648.png
项目工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突。
//头文件--function1.h
#include <stdio.h>
namespace MyNamespace {void function1() {printf("This is function1 in file1\n");}
}
//头文件--function2.h
#include <stdio.h>
namespace MyNamespace {void function2() {printf("This is function2 in file2\n");}
}
//测试文件
#include "function1.h"
#include "function2.h"// 声明函数原型,以便在main函数中调用int main() {MyNamespace::function1();MyNamespace::function2();return 0;
}
8264bc689be24edda6f476c15a24c7f8.png

3.命名空间的使用

编译查找一个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间里面去查找。所以下面程序会编译报错
#include<stdio.h>
namespace bite
{int a = 0;int b = 1;
}
int main()
{// 编译报错:error C2065: “a”: 未声明的标识符printf("%d\n", a);return 0;
}

所以我们要使用命名空间中定义的变量/函数,有三种方式:
• 指定命名空间访问,项目中推荐这种方式。
• using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式。
• 展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。
#include <stdio.h>
namespace N {int a = 520;int b = 1314;
}
int main()
{  // 指定命名空间访问printf("%d\n", N::a);// using将命名空间中某个成员展开using N::b;printf("%d\n", b);return 0;
}
注意:
C++标准库都放在⼀个叫std(standard)的命名空间中

标准库命名空间: C++标准库中的所有功能都定义在std命名空间中。你可以使用std::前缀来访问标准库中的成员,或者使用using声明或指令来引入特定的成员。在使用命名空间时,应该考虑到代码的清晰性和可维护性。虽然using指令可以简化代码,但过度使用可能会导致名称冲突和代码的不可预测性。因此,最好是在局部作用域或函数内部使用using声明,而不是在全局作用域或头文件中使用using namespace指令。

4.C++的输入输出

1.<iostream> 是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输
出对象。
2.std::cin 是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输
入流。
3.std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。
4.std::endl 是一个函数,流插入输出时,相当于插入一个换⾏字符加刷新缓冲区。
5.<<是流插入运算符,>>是流提取运算符。(C语⾔还用这两个运算符做位运算左移/右移)
6.使C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的),其实最重要的是C++的流能更好的支持自定义类型对象的输⼊输出。
7. IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,这里简单认识⼀下C++ IO流的用法。
8.cout/cin/endl等都属于C++标准库,C++标准库都放在一个叫std(standard)的命名空间中,所以要
通过命名空间的使用方式去用他们。
9.一般日常练习中我们可以using namespace std,实际项目开发中不建议using namespace std。
10.这用我们没有包含<stdio.h>,也可以使用printf和scanf,在包含<iostream>间接包含了。vs系列
编译器是这样的,其他编译器可能会报错。

代码展示

#include <iostream>
using namespace std;
int main() {int a = 10;double b = 5.2;char c = 'd';cout << a << " " << b << " " << c << endl;std::cout << a << " " << b << " " << c << std::endl;scanf("%d %lf", &a, &b);printf("%d %lf", a, b);
// 可以⾃动识别变量的类型cin >> a;cin >> b >> c;cout << a << endl;cout << b << " " << c << endl;return 0;
}

扩展了解部分(提高效率)

#include<iostream>
using namespace std;
int main()
{
// 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
// 可以提⾼C++IO效率
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
return 0;
}

结束语

本节内容新知识不是很多,着重讲了namespace的用法,下节内容将带来更加有趣的C++知识,欢迎大家的捧场!!!

最后感谢各位友友的支持,友友们动个手指点个赞,留个评论吧!!!

相关文章:

C++基础篇(1)

目录 前言 1.第一个C程序 2.命名空间 2.1概念理解 2.2namespace 的价值 2.3 namespace的定义 3.命名空间的使用 4.C的输入输出 结束语 前言 本节我们将正式进入C基础的学习&#xff0c;话不多说&#xff0c;直接上货&#xff01;&#xff01;&#xff01; 1.第一个C程…...

云视频监控中的高效视频转码策略:视频汇聚EasyCVR平台H.265自动转码H.264能力解析

随着科技的快速发展&#xff0c;视频监控技术已经广泛应用于各个领域&#xff0c;如公共安全、商业管理、教育医疗等。与此同时&#xff0c;视频转码技术作为视频处理的关键环节&#xff0c;也在不断提高视频的质量和传输效率。 一、视频监控技术的演进 视频监控技术的发展历…...

xcode配置swift使用自定义主题颜色或者使用RGB或者HEX颜色

要想在xcode中使用自定义颜色或者配置主题色&#xff0c;需要在Assets中配置&#xff0c;打开Assets文件&#xff0c;然后点击添加Color Set&#xff1a; 输入颜色的名称&#xff0c;然后选中这个颜色&#xff0c;会出现两个颜色&#xff1a; Any Appearance表示亮色模式下使用…...

相同含义但不同类型字段作为join条件时注意事项

假设表A和表B中都有表示学号的stu_id字段&#xff0c;但该字段在表A和表B中类型分别为bigint和string。当直接通过该字段进行join时&#xff0c;一般情况下可以得到我们预期的结果。 select a.stu_id from a as r join b as l on r.stu_id l.stu_id 但是如果学号长度较长的…...

数据结构(3.8)——栈的应用

栈在括号匹配中的应用 流程图 代码 #include <stdio.h> #include <stdlib.h> #define MaxSize 10typedef struct {char data[MaxSize];int top; } SqStack;// 初始化栈 void InitStack(SqStack* S) {S->top -1; // 初始化栈顶指针 }// 判空 bool StackEmpty(…...

前端面试题35(在iOS和Android平台上,实现WebSocket协议有哪些常见的库或框架?)

在iOS和Android平台上&#xff0c;实现WebSocket协议有许多成熟且被广泛使用的库和框架。下面是一些推荐的选项&#xff1a; iOS 平台 SocketRocket 简介&#xff1a;这是由Facebook开源的库&#xff0c;专门为iOS和Mac OS X设计&#xff0c;提供WebSocket连接的功能。它基于S…...

Mysql如何高效ALTER TABL

ALTER TABLE 缺点 MySQL 的ALTER TABLE 操作的性能对大表来说是个大问题。 MySQL MySQL 执行大部分修改表结构操作的方法是用新结构的 创建一个&#xff0c;空表从旧表中查出所有数据插入&#xff0c;新表然后删除旧。表这样操作可能需要花费很长&#xff0c;时间 如内果存不…...

vue3+vite搭建第一个cesium项目详细步骤及环境配置(附源码)

文章目录 1.创建vuevite项目2.安装 Cesium2.1 安装cesium2.2 安装vite-plugin-cesium插件&#xff08;非必选&#xff09;2.3 新建组件页面map.vue2.4 加载地图 3.完成效果图 1.创建vuevite项目 打开cmd窗口执行以下命令&#xff1a;cesium-vue-app是你的项目名称 npm create…...

LiteOS增加执行自定义源码

开发过程注意事项&#xff1a; 源码工程路径不能太长 源码工程路径不能有中文 一定要关闭360等杀毒软件&#xff0c;否则编译的打包阶段会出错 增加自定义源码的步骤: 1.创建源码目录 2. 创建源文件 新建myhello目录后&#xff0c;再此目录下再新建源文件myhello_demo.c 3. 编…...

《Nature》文章:ChatGPT帮助我学术写作的三种方式

图片翻译 ** 文章内容** 忏悔时间&#xff1a;我使用生成式人工智能&#xff08;AI&#xff09;。尽管在学术界关于聊天机器人是积极力量还是消极力量的争论不休&#xff0c;但我几乎每天都使用这些工具来完善我所写论文中的措辞&#xff0c;并寻求对我被要求评估的工作进行替…...

防火墙安全策略与用户认证综合实验

一、实验拓扑 二、实验需求 1.DMZ区内的服务器&#xff0c;办公区仅能在办公时间内<9:00-18:00>可以访问&#xff0c;生产区的设备全天可以访问 2.办公区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3.办公区设备10.0.2.10不充许访问DMZ区的FTP服务器和HT…...

vue学习day05-watch侦听器(监视器)、Vue生命周期和生命周期的四个阶段、、工程化开发和脚手架Vue cli

13、watch侦听器&#xff08;监视器&#xff09; &#xff08;1&#xff09;作用&#xff1a;监视数据变化&#xff0c;执行一些业务逻辑或异步操作 &#xff08;2&#xff09;语法&#xff1a; 1&#xff09;简写语法——简单数据类型&#xff0c;直接监视 ① Watch:{ 数…...

数字人+展厅互动体验方案:多元化互动方式,拓宽文化文娱新体验

数字化创新已成为推动展厅可持续发展&#xff0c;创造全新消费体验&#xff0c;满足游客多元化需求的关键力量。 “数字人数字互动展厅”可以适应年轻一代的文化传播与多媒体互动新体验趋势&#xff0c;打造新生代潮玩聚集地&#xff0c;促进文化创意传播与互动体验场景创新&a…...

在Spring Boot项目中集成监控与报警

在Spring Boot项目中集成监控与报警 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 在当今的软件开发中&#xff0c;监控和报警系统是保证系统稳定性和可靠性的重要组成部分。Spring Boot…...

opencv实现目标检测功能----20240704

早在 2017 年 8 月,OpenCV 3.3 正式发布,带来了高度改进的“深度神经网络”(dnn)模块。 该模块支持多种深度学习框架,包括 Caffe、TensorFlow 和 Torch/PyTorch。这次我们使用Opencv深度学习的功能实现目标检测的功能,模型选用MobileNetSSD_deploy.caffemodel。 模型加载…...

音视频解封装demo:使用libmp4v2解封装(demux)出mp4文件中的h264视频数据和aac语音数据

1、README 前言 本demo是使用的mp4v2来将mp4文件解封装得到h264、aac的&#xff0c;目前demo提供的.a静态库文件是在x86_64架构的Ubuntu16.04编译得到的&#xff0c;如果想在其他环境下测试demo&#xff0c;可以自行编译mp4v2并替换相应的库文件&#xff08;libmp4v2.a&#…...

手撸俄罗斯方块(一)——简单介绍

手撸俄罗斯方块 简单介绍 《俄罗斯方块》&#xff08;俄语&#xff1a;Тетрис&#xff0c;英语&#xff1a;Tetris&#xff09;&#xff0c;是1980年末期至1990年代初期风靡全世界的电脑游戏&#xff0c;是落下型益智游戏的始祖&#xff0c;电子游戏领域的代表作之一&a…...

构建LangChain应用程序的示例代码:61、如何使用 LangChain 和 LangSmith 优化链

本示例介绍如何使用 LangChain 和 LangSmith 优化链。 设置 我们将为 LangSmith 设置环境变量&#xff0c;并加载相关数据 import osos.environ["LANGCHAIN_PROJECT"] "movie-qa" # 设置 LANGCHAIN_PROJECT 环境变量为 "movie-qa"import pan…...

Android系统通过属性设置来控制log输出的方案

Android系统通过属性设置来控制log输出的方案 背景 项目中经常需要在针对性的模块或者文件&#xff0c;分析问题的时候输出Log&#xff0c;但问题分析完成后&#xff0c;又由于性能问题&#xff0c;需要关闭这些log输出。当前大多数情况下是控制整个系统的log等级来实现&#…...

JavaDoc的最佳实践

文章目录 一、JavaDoc 使用说明1.1 什么是 JavaDoc1.2 文档注释结构1.3 常见的 Javadoc 标签 二、文档最佳实践2.1 注释原则2.2 实际案例 参考资料 一、JavaDoc 使用说明 1.1 什么是 JavaDoc JavaDoc 是一款能根据源代码中的文档注释来产生 HTML 格式的 API 文档的工具。 Jav…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...