C++初阶--C++入门之基础学习
0.前言
C++是一门非常好的编程语言,但可能在学习C++的过程中会遇到很多困难。人们常说 “一个人走得很快,一群人会走的更远”, 所以就让我们一起攻坚克难,一起征服C++吧!从本章开始,我们将开始C++的基础学习!一起加油吧!🎠🎠🎠
1.什么是C++
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(objectoriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
2.C++关键字
C++总计63个关键字,C语言32个关键字
asm | do | if | return | try | continue |
---|---|---|---|---|---|
auto | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | false | private | template | void | true |
const_cast | float | protected | this | volatile | while |
delete | goto | reinterpret_cast |
3.命名空间
①像下面这样,我们在命名全局变量的时候并不知道C语言库里面的函数,这时候就会发生命名冲突②还有当我们在公司分模块写代码的时候,我们并不知道别人是怎样命名函数、全局变量的,也可能引发命名冲突。
一个栗子:
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main()
{printf("%d\n", rand);return 0;
}
代码运行的结果:
C语言不能很好的解决命名冲突的问题,而在C++中使用了命名空间对标识符的名称进行本地化,以避免命名冲突或名字污染;而定义命名空间,需要使用到
namespace
关键字,后面跟命名空间的名字(注意不需要在{}
后面加逗号),然后接一对{}
,{}
中为命名空间的成员,把变量封装在命名空间域中,防止引起命名冲突。
3.1命名空间的定义
命名空间形式如下:
namespace phh
{int rand = 1;
}
现在我们已经命名好了,那么该怎么访问命名空间里面的变量呢?这时候我们要使用
::
域作用限定符,左边空白表示全局域去访问全局变量,左边是命名空间的名字则回去命名空间域访问命名空间的成员变量。
eg:
#include<stdio.h>int a = 1;
//namespace是C++的关键字,后面跟的是命名空间的名字
//然后加一对{}括号即可(注意不需要在{}加逗号)
//把全局变量封装在命名空间域中,防止引起命名冲突
namespace phh
{int a = 2;
}
//::域作用限定符
//左边空白,会去全局域访问
int main()
{int a = 0;printf("%d\n", a);printf("%d\n", ::a);printf("%d\n", phh::a);return 0;
}
代码运行的结果如下:
这时候我们就可以用C++解决与库里面命名冲突问题了
#include<stdio.h>
#include<stdlib.h>
namespace phh
{int rand = 1;
}
int main()
{printf("%d\n", phh::rand);printf("%p\n", rand);//库里面的rand是函数,函数名为地址return 0;
}
代码运行的结果如下:
3.2命名空间的特性
1.正常的命名空间定义–可以定义变量/函数/类型
namespace phh
{int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}
2.命名空间可以嵌套使用
#include<stdio.h>
namespace N1
{int a = 0;int b = 0;int Add(int left, int right){return left + right;}namespace N2{int a = 1;int c = 0;int d = 0;int Sub(int left, int right){return left - right;}}
}
int main()
{printf("%d\n", N1::a);//嵌套的命名空间还可以使用同一个变量名printf("%d\n", N1::N2::a);//也可以把函数封装在命名空间域中,然后通过指定空间域进行访问printf("%d\n", N1::Add(1, 2));return 0;
}
代码运行的结果如下:
3.同一个工程中可以存在多个相同的名称,编译器最后会合并成同一个命名空间
//Queue.h
namespace N1
{int x = 1;
}
//Stack.h
namespace N1
{int y = 2;
}
#include<stdlib.h>
#include"Queue.h"
#include"Stack.h"
int main()
{//printf("%d\n", N1::x);printf("%d\n", N1::y);return 0;
}
代码运行的结果如下:
注意: 如果
Queue.h
和Stack.h
的N1
中使用了同一个变量名,会发生命名冲突,这时候可以使用命名空间嵌套或定义不同命名空间的名字。
3.3命名空间的使用
命名空间使用三种方式:
①加命名空间的名称及作用限定符
#include<stdio.h>
int a = 1;
namespace phh
{int a = 2;
}int main()
{int a = 0;printf("%d\n", a);printf("%d\n", ::a);printf("%d\n", phh::a);return 0;
}
这种方法,需要对命名空间域进行多次访问,会显得代码冗余;建议在访问次数少的时候使用。
②使用using namespace 命名空间名称引入
#include<iostream>
namespace phh
{int a = 1;int b = 1;
}
using namespace phh;
//相当于把命名空间中的成员变量放到了全局域
int main()
{int a = 0;printf("%d\n", a);printf("%d\n", ::a);return 0;
}
代码运行的结果如下:
这种方法,把命名空间域中的变量放到全局域中可能会引起命名冲突,一般建议在日常练习中使用。
③使用using将命名空间中的某个成员引入
#include<stdio.h>
int b = 0;
namespace phh
{int a = 1;int b = 1;
}
using phh::a;
int main()
{printf("%d\n", a);return 0;
}
代码运行结果如下:
不建议把命名空间的里变量全部展开,存在风险,可以指定成员访问或把常用的展开,推荐使用这种方法。
4.C++输入&输出
C++学习须知:
1.
std
是C++标准库的命名空间命名,C++标准库的定义实现都放在这个命名空间中
2.cout
是标准输出对象(控制台),cin
是标准输入对象(键盘),endl
是特殊的C++符号,相当于换行符\n
3.cout\cin\endl
被定义在std(C++标准库的命名空间)中,需要包含头文件#include<iostream>
需要按命名空间的使用方法才能使用
4.cout\cin
可以自动识别变量类型,可以一次读取多个变量(也就是不用像C语言中printf\scanf
那样指定变量的格式读取、输出多个变量)
5.在以.cpp
为后缀的文件中,C语言、C++混用的时候,使用printf/scanf
比cout\cin
效率高一点,因为C++要兼容C语言,所以C++、C语言有各自不同的缓冲区,所以在输入输出前需要检查C语言缓冲区是否有东西,会影响效率。
一个栗子:
//C++的输入和输出
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
int main()
{int x = 0;double b = 0;cin >> x>>b;cout << x <<" "<< b << endl;return 0;
}
代码运行的结果如下:
std命名空间的使用惯例:
1.在日常练习中,建议直接
using namespace
即可,这样很方便。
2using namespace std
展开,标准库就全部暴露出来,如果我们定义的变量跟库里面的类型/对象/函数,就存在冲突问题,所以在项目开发中建议展开某个库里面的成员变量,如需要使用cout
,就建议using std::cout
。
总结
本章我们一起学习了C++的一些细则,如命名空间、输入输出,了解了C++与C语言的不同之处,内容不多,但很重要哦!希望对你们了解C++有些许帮助!感谢大家阅读,如有不对,欢迎纠正!🎠🎠🎠
相关文章:

C++初阶--C++入门之基础学习
0.前言 C是一门非常好的编程语言,但可能在学习C的过程中会遇到很多困难。人们常说 “一个人走得很快,一群人会走的更远”, 所以就让我们一起攻坚克难,一起征服C吧!从本章开始,我们将开始C的基础学习&#x…...

服务器虚拟化部署
服务器虚拟化部署 1、背景2、目的3、环境4、部署4.1、部署VMware ESXi4.1.1、准备工作4.1.2、部署ESXi4.1.3、配置ESXi4.1.4 、部署虚拟机 1、背景 项目上利旧9台服务器,项目需要使用15台服务器,外购已经没有项目硬件采购预算,只能从目前的…...
实验篇(7.2) 01. 实验环境介绍 远程访问 ❀ Fortinet网络安全专家 NSE4
【简介】学习NSE4,如果只看文章而不动手做实验,就象耍流氓。为了有效的巩固学习到的内容,建议经常动手做实验。实验不怕出错,身经百战后,再在生产环境部署和配置FortiGate防火墙,就会做到胸有成竹。 虚拟实…...

ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
ThinkPHP6 模型层的模型属性,表映射关系,以及模型层的CRUD及如何在控制层中使用模型层 1. model 模型层的默认映射规则 模型,即mvc模式中的model层,model层用来对接数据库,操作数据库的增删改查。 在tp6中ÿ…...

CodeForces.1806A .平面移动.[简单][判断可达范围][找步数规律]
题目描述: 题目解读: 给定移动规则以及起始点,终点;分析终点是否可达,可达则输出最小步数。 解题思路: 首先要判定是否可达。画图可知,对于题目给定的移动规则,只能到达起始点(a,b…...

Linux系统编程学习 NO.4 ——基础指令学习、操作系统时间的概念、文件压缩包的概念
1.时间相关的概念以及指令 1.1.时间相关的指令 1.1.1.date指令 date可以指定时间显示的格式:date 指定格式 选项 %H:小时 %M:分钟 %S:秒数 %Y:年份 %m:月份 %d:日 %F:相当于%Y-%m-%d %X:相当…...
leecode 数据库:601. 体育馆的人流量
导入数据: Create table If Not Exists Stadium (id int, visit_date DATE NULL, people int); Truncate table Stadium; insert into Stadium (id, visit_date, people) values (1, 2017-01-01, 10); insert into Stadium (id, visit_date, people) values (2, 20…...

gym不渲染画面的解决方案(gym版本号0.26.2)
确认gym版本号 我安装了新版gym,版本号是0.26.2,不渲染画面的原因是,新版gym需要在初始化env时新增一个实参render_mode‘human’,并且不需要主动调用render方法,官方文档入门教程如下 import gym import numpy as n…...

如何在 Fedora 37 上安装 FileZilla?
FileZilla 是一款流行的开源 FTP(文件传输协议)客户端,它提供了一个直观的界面来管理和传输文件。本文将详细介绍如何在 Fedora 37 上安装 FileZilla。以下是安装过程的详细步骤: 步骤一:更新系统 在安装任何软件之前…...

网终安全技术(刘化君)课后被略的答案
目录 8.HTTP客户机与Wb服务器通信通常会泄露哪些信息? 9.在TCP连接建立的3次握手阶段,攻击者为什么可以成功实施SYN Flood攻击?在实际中,如何防范此类攻击? 常用的网络漏洞扫描技术有哪几种?试举例说明。…...
架构思想之DDD
领域驱动设计(Domain-Driven Design,简称DDD)是一种架构思想,旨在通过将业务问题领域化,将业务逻辑放在核心领域中,以实现更好的软件设计和可维护性。下面将介绍如何实现DDD的Java实现,包括如何…...

FinClip | 2023 年 4 月产品大事记
我们的使命是使您(业务专家和开发人员)能够通过小程序解决您的关键业务流程挑战。不妨让我们看看在本月的产品与市场发布亮点,看看它们如何帮助您实现目标。 产品方面的相关动向👇👇👇 全新版本的小程序统…...
试论什么是圣人境界
人类进化方向就是不断的提高智力。鼓吹体力都是反人类。 圣人是人类能够达到的最高境界,再上一层就是神了。按照中华传统,说圣人就是神也是正确的。 圣人境界是什么样子的?在这一点上,孔子给予了答案:吾道一以贯之。掌…...

在外远程登录局域网下的象过河ERP管理系统,无需公网IP
文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 转发自CSDN远程穿透的文章:公网远程访问公司内网象过河ERP系统「内网穿透」 概述 ERP系统对于企业来说重要性不言而…...

golang 服务中 context 超时处理的思考
文章目录 前言起因:日志告警引发的思考什么是contextcontext的作用context超时之后继续执行 or 中断 最后 前言 公司运行的服务代码中,随处可见各种各样的日志信息,其中大多数是用来记录各种异常的日志,一方面,当出现…...
遇到Uniapp配置meta不生效怎么解决
Uniapp是一种基于 Vue.js 的跨平台应用开发框架,其开发简单、易上手,可以快速构建出 iOS、Android 和 H5 页面,成为现在移动应用开发的重要工具之一。然而,跨平台应用的开发也带来了一些问题,比如本文即是解决 uniapp …...
C语言基础知识:位与位字段
目录 位与字节 位 比特 字节 对齐特性 位字段 位与字节 位 二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位。其中8 bit就称为一个字节(Byte)。计算机中的CPU位数指的是CPU一次能处理的最大位数࿰…...

新版android studio gradle插件7.4.2.pom一直无法下载问题
android studio同步时候出现org.gradle.api.plugins.UnknownPluginException,Plugin [id: com.android.application, version: 7.4.2] was not found in any of the following sources: pom插件一直无法下载,搞了好几天,简直想砸电脑&#x…...
Shell——变量和引用
1.总结变量的类型及含义? 2.实现课堂案例计算长方形面积?(6种方式) 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815 (通过多种方法实现) 1)截取网站访问的协…...

实际开发中一些实用的JS数据处理方法
写在开头 JavaScript 是一种脚本语言,最初是为了网页提供交互式前端功能而设计的,而现在,通过 Node.js,JavaScript 还可以用于编写服务器端代码。 JavaScript 具有动态性、基于原型的面向对象特性、弱类型、多范式、支持闭包执行…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

.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 适用场…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...