C++基础篇(一)-- 简单入门
C++ 语言是在优化 C 语言的基础上为支持面向对象的程序设计而研制的一个通用目的的程序设计语言。在后来的持续研究中,C++ 增加了许多新概念,例如虚函数、重载、继承、标准模板库、异常处理、命名空间等。
C++ 语言的特点主要表现在两个方面:全面兼容 C 语言 和 支持面向对象的方法。
1 基础知识
1.1 扩展名
C语言源文件的后缀非常统一,在不同的编译器下都是.c。C++ 源文件的后缀则有些混乱,不同的编译器支持不同的后缀,下表是一个简单的汇总:
编译器 | Microsoft Visual C++ | GCC(GNU C++) | Borland C++ | UNIX |
---|---|---|---|---|
后缀 | cpp、cxx、cc | cpp、cxx、cc、c++、C | cpp | C、cc、cxx |
通常使用 .cpp
作为 C++ 源文件的后缀,这样更加通用和规范。
1.2 注释符
- 单行注释://注释内容
int x; // 定义 x 的数据类型为 int
- 块注释:/* 注释内容 */
if(x>y)return x;
else return y;
/* 如果 x 大于 y 则返回 x
否则返回 y */
注释符可以放置在代码的任何位置,且不参与代码运行。
1.3 头文件声明
最简单的C++程序往往是下面这样声明头文件:
//C++中常用写法
#include < iostream > //引用C++标准头文件库
using namespace std; //使用名字空间
#include
为C/C++中包含头文件命令,用于将指定头文件嵌入源文件中。#include
一般用在 C、C++ 等语系的编译环境(编程软件的编程代码)中,也即告诉你,在这个地方要插入一堆代码,而这堆代码在另一个文件里。
iostream
是 C++ 的一个头文件库,在安装 C++ 环境的时候就已安装于电脑中,只需要用 include 将该它包含进来,就可以使用它的代码。
C++已把标准C++库的组件放在一个名位 std 的 namespace 里面中,如果include头文件的时候加上.h,默认有using namespace
,否则需要自己加上 using namespace std
。
因此若没有第二行语句,cout 就会没有定义,除非使用 cout 时写成 std::cout
,即指明其来自空间std 。
按照 C 语言规则声明则是下面这样:
#include < iostream. h > //引用头文件,不需要声明名字空间
不加.h的是现在 C++ 中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名 .h 的限制,避免因为.h而造成的额外的处理和修改。而加.h是c语言的用法,但是在c++中也支持这种用法,主要是为了向下兼容c 的内容,平时尽量不用这种方法 。
在C++程序中,头文件不再以“.h”结尾,一些在C语言中常用的头文件在C++中的名字变为去掉“.h”,并在开头增加字符 c 。例如:
#include < cstdio > //标准化后经过改造的C标准库,所有的组件都放在了std中
#include < cstring > //C++标准库下,基于char* 的字符处理函数库
#include < string > //增加了C++类的字符处理函数库
#include < cstdlib >
#include < bits/stdc++.h> //号称万能库,在大部分情况下使用这一行就可以省去其他库的生声明
<stdio.h>是以往 C 和 C++ 的头文件,是标准C++(STL)函数库中的头文件,且 cstdio 中的函数都定义在一个名称空间 std 里面,如果要调用这个名字空间的函数,须加std::
或者在文件中声明 using namespace std
。
<string.h> 是标准C提供的字符处理函数集。面向char *.。 是C++为兼容C提供的 <string.h> 的C++版本,里面的主要改进有:将一些隐藏变量编入命名空间;修正一些C++编译器认为Bug的代码。
<stdlib.h>可以提供一些函数与符号常量,是C++为兼容C提供的版本。
1.4 命名空间
命名空间里面包含了逻辑结构上相互关联的一组类、函数、模板等。命名空间像是一个容器,把某些在逻辑结构上相关的 “对象” 放在一起并与外界区分。特别的,命名空间里的变量名或类名可以和命名空间外的变量名或类名重名。
使用命名空间的时候,我们可以用 花括号 把声明块括起来,再以关键字 namespace 开头并命名,其基本格式如下:
namespace 命名空间的名字
{声明块
}
``其中声明块中可以包含变量、类、函数等。例如:
```cpp
namespace S
{int x;void FunA(){...}
}
在命名空间外使用命名空间内的成员:命名空间的名字加上作用域运算符 ::
。
参考上例 namespace S,若访问 x,可写成 S::x
;访问 FunA()
则为 S::FunA()
。
命名空间的嵌套, 具有分层屏蔽的作用。例如:
namespace S1
{namespace S2{int x;void FunA(){...}}
}
若要访问 x,则可写为 S1::S2::x
,同理,访问 FunA() 则可写为 S1::S2::FunA()
。
using 声明:若命名空间内的某个成员使用了 using 声明,那么这个成员在程序的后续使用中,可直接使用成员名,无需添加限定修饰名。使用 using 声明:以关键字 using 开头后跟命名空间内的成员名。参考上例嵌套的命名空间:
namespace S2 中 int x 的 using 声明为:using S1::S2::x
;
注意: using namespace 后不能加类名或变量名。同上,若 namespace S2 中 int x 的 using 声明写为 using namespace S1::S2::x
便是错误的。
using 指示符可以一次性地使命名空间内的全体成员被直接使用。using 指示符的使用: 以关键字 using namespace
开头后跟命名空间名字。特别的,std 命名空间声明和定义了标准 C++ 库中的所有组件,使用 using namespace std
; 则可使用标准 C++ 库中的所有成员。
1.5 输入与输出
C++ 标准 I/O 库包含 iostream、fstream 和 sstringstream。iostream、fstream 比较常用,一般操作于输入和输出,相较于前两者来说 sstringstream 的出现频率就低了许多,一般操作于数据的格式化。为了能更好的理解 C++ 语言的标准 I/O 库,我们参考 cplusplus 官网 的相关内容,整理注释了一份关于输入输出流类继承体系的关系图:
1. 标准输出流对象 cout
预定义的插入符 “ << ” 作用在流类对象 cout 上可实现最基本的屏幕输出,其格式为:
cout << 表达式1 << 表达式2...;
在输出语句中,若串联多个插入符,则可输出多个数据项。例如:
cout << a << b << c;
则依次输出 a,b,c 三个数据项的值。
若插入符后面是复杂的表达式,则系统自动计算其表达式的值并传给插入符。例如:
cout << "a+b=" << a+b;
依次输出字符串 “ a+b= ” 以及 a+b 的计算结果。
2. 标准输入流对象 cin
预定义的提取符 “ >> ” 作用在流类对象 cin 上可实现对键盘输入的提取操作,其格式为:
cin >> 表达式1 >> 表达式2...
其中表达式通常用于存放输入值的变量。例如:
int a,b;
cin >> a >> b;
即编译执行后,输入 a 和 b 的值,a 和 b 之间使用空格分隔。如输入:1 2,则给 a 赋值为 1,b 赋值为 2。
3. 简单的 I/O 格式控制
一般情况下,使用 cin 和 cout 进行数据的输入和输出时,会自动按照默认的格式进行处理。如若需要设定特殊的格式,可利用 C++ I/O 流类库提供的操纵符进行调整。这些操纵符可直接嵌入到输入输出语句中实现格式控制。常用的 I/O 流类库操纵符,请阅读:C++ 基本的输入输出
1.6 编译和运行C++程序
C/C++ 代码生成可执行文件的过程:
我们常见的编译器有两个:
- gcc 编译器
- g++ 编译器
gcc和g++都是GNU(组织)的编译器。
程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示:
$ gcc main.cpp -lstdc++ -o main
新建一个helloworld.cpp文件,最简单的编译方式:
$ g++ helloworld.cpp
由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。程序可以这样来运行:
$ ./a.out
Hello, world!
通常我们使用 -o 选项指定可执行程序的文件名,以下实例生成一个 helloworld 的可执行文件:
$ g++ helloworld.cpp -o helloworld
执行 helloworld:
$ ./helloworld
Hello, world!
如果是多个 C++ 代码文件,如 runoob1.cpp、runoob2.cpp,编译命令如下:
$ g++ runoob1.cpp runoob2.cpp -o runoob
生成一个 runoob 可执行文件。
g++ 有些系统默认是使用 C++98,我们可以指定使用 C++11 来编译 main.cpp 文件:
g++ -g -Wall -std=c++11 main.cpp
g++ 常用命令选项:请阅读:g++ 常用命令选项
gcc和g++编译器的区别
g++:会把.c和.cpp的文件都当作是C++的源程序进行编译。
gcc:会把.c的程序当作是C的源程序进行编译,.cpp 的程序当作是C++的源程序进行编译
参考
- C++语言:https://www.lanqiao.cn/courses/2752/learning/?id=47676&compatibility=false
- 从C到C++:http://c.biancheng.net/view/2191.html
- C++基础:https://www.runoob.com/cplusplus/cpp-environment-setup.html
- 头文件声明:https://blog.csdn.net/weixin_39737764/article/details/
- gcc编译:https://blog.csdn.net/weixin_41010198/article/details/117523288
相关文章:
C++基础篇(一)-- 简单入门
C 语言是在优化 C 语言的基础上为支持面向对象的程序设计而研制的一个通用目的的程序设计语言。在后来的持续研究中,C 增加了许多新概念,例如虚函数、重载、继承、标准模板库、异常处理、命名空间等。 C 语言的特点主要表现在两个方面:全面兼…...
前端整理 —— javascript 2
1. generator(生成器) 详细介绍 generator 介绍 generator 是 ES6 提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态。执行generator,会生成返回一个遍历器对象。返回的…...
Spring-注解注入
一、回顾XML注解 bean 配置 创建 bean public class Student { } 配置 xml bean <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSche…...
华为校招机试 - 攻城战(Java JS Python)
目录 题目描述 输入描述 输出描述 用例 题目解析 JavaScript算法源码 Java算法源码...
Docker入门
Docker一、何为DockerDocker是一个开源的应用容器引擎,基于GO语言并遵循从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后在发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使…...
时间序列分析 | CNN-LSTM卷积长短期记忆神经网络时间序列预测(Matlab完整程序)
时间序列分析 | CNN-LSTM卷积长短期记忆神经网络时间序列预测(Matlab完整程序) 目录 时间序列分析 | CNN-LSTM卷积长短期记忆神经网络时间序列预测(Matlab完整程序)预测结果模型输出基本介绍完整程序参考资料预测结果 模型输出 layers = 具有以下层的 151 Layer 数组:...
【蒸滴C】C语言结构体入门?看这一篇就够了
目录 一、结构体的定义 二、结构的声明 例子 三、 结构成员的类型 结构体变量的定义和初始化 1.声明类型的同时定义变量p1 2.直接定义结构体变量p2 3.初始化:定义变量的同时赋初值。 4.结构体变量的定义放在结构体的声明之后 5.结构体嵌套初始化 6.结构体…...
第十三届蓝桥杯
这里写目录标题一、刷题统计(ceil函数返回的是等值于某最小整数的浮点值,不强制转换回int就wa,没错就连和int整数相加都wa二、修剪灌木(主要应看清楚会调转方向三、统计子矩阵(前缀和滑动窗口⭐)四、[积木画…...
消息队列mq
应用场景: 1、解耦 2、削峰填谷 3、异步处理 4、消息通讯 工作模式: 一个消息只能被消费一次(订阅模式除外),消费者接受到消息会回调业务逻辑,消费逻辑写在回调函数里面。 1、简单模式:一个生产…...
[学习笔记]黑马程序员Spark全套视频教程,4天spark3.2快速入门到精通,基于Python语言的spark教程
文章目录视频资料:一、Spark基础入门(环境搭建、入门概念)第二章:Spark环境搭建-Local2.1 课程服务器环境2.2 Local模式基本原理2.3 安装包下载2.4 Spark Local模式部署第三章:Spark环境搭建-StandAlone3.1 StandAlone…...
git push和 git pull的使用
git push与git pull是一对推送/拉取分支的git命令。git push 使用本地的对应分支来更新对应的远程分支。$ git push <远程主机名> <本地分支名>:<远程分支名>*注意: 命令中的本地分支是指将要被推送到远端的分支,而远程分支是指推送的目标分支&am…...
首发,pm3包,一个用于多组(3组)倾向评分匹配的R包
目前,本人写的第二个R包pm3包已经正式在CRAN上线,用于3组倾向评分匹配,只能3组不能多也不能少。 可以使用以下代码安装 install.packages("pm3")什么是倾向性评分匹配?倾向评分匹配(Propensity Score Match…...
基于Canal的数据同步
基于Canal的数据同步 一、 系统结构 该数据同步系统由Spring Boot和Canal共同组成。 Spring Boot 是一个流行的 Java Web 框架,而 Canal 则是阿里巴巴开源的 MySQL 数据库的数据变更监听框架。结合 Spring Boot 和 Canal,可以实现 MySQL 数据库的实时数…...
vuetify设置页面默认主题色
前言 最近工作中接到一个任务: 项目中分light和dark两种主题色a、b页面默认为dark其他页面默认为light 项目前端环境: vue2jsyarnvuexvuetifyelement ui 解决思路 routerjs中配置路径时进行默认主题设置 在左侧aside点击菜单时,进行主题切…...
【Python入门第二十三天】Python 继承
Python 继承 继承允许我们定义继承另一个类的所有方法和属性的类。 父类是继承的类,也称为基类。 子类是从另一个类继承的类,也称为派生类。 创建父类 任何类都可以是父类,因此语法与创建任何其他类相同: 实例 创建一个名为…...
C#中,读取一个或多个文件内容的方法
读取一个或多个文件内容的方法 在C#中,可以使用File.ReadAllLines方法一次读取多个文件中的所有行内容。例如,以下代码读取了两个文件中的所有行内容,然后将它们合并在一起: string[] file1Lines File.ReadAllLines("file1…...
1 基于神经辐射场(neural Radiance Fileds, Nerf)的三维重建- 简介
Nerf简介 Nerf(neural Radiance Fileds) 为2020年ICCV上提出的一个基于隐式表达的三维重建方法,使用2D的 Posed Imageds 来生成(表达)复杂的三维场景。现在越来越多的研究人员开始关注这个潜力巨大的领域,也…...
水果FLStudio21.0.0中文版全能数字音乐工作站DAW
FL Studio 21.0.0官方中文版重磅发布纯正简体中文支持,更快捷的音频剪辑及素材管理器,多样主题随心换!Mac版新增对苹果M2/1家族芯片原生支持。编曲、剪辑、录音、混音,20余年的技术积淀和实力研发,FL Studio 已经从电音…...
【GlobalMapper精品教程】055:GM坐标转换器的巧妙使用
GM软件提供了一个简单实用的坐标转换工具,可以实现地理坐标和投影坐标之间的高斯正反算及多种转换计算。 文章目录 一、坐标转换器认识二、坐标转换案例1. 地理坐标←→地理坐标2. 地理坐标←→投影坐标三、在输出坐标上创建新的点四、其他转换工具的使用一、坐标转换器认识 …...
C语言之中rand()函数是如何实现的
rand()函数是一个C标准库中的随机数生成函数,用于生成一个范围在0到RAND_MAX之间的伪随机数。RAND_MAX是一个常量,它是随机数的最大值,通常被定义为32767。 rand()函数的实现原理可以概括为以下几个步骤: 初始化随机数生成器 在…...
winform控件PropertyGrid的应用(使运行中的程序能像vistual studio那样设置控件属性)
上周在看别人写的上位机demo代码时,发现创建的项目模板是"Windows 窗体控件库"(如下图) 生成的项目结构像自定义控件库,没有程序入口方法Main,但却很神奇能调试,最后发现原来Vistual Studio启动了一个外挂程序UserContr…...
SBUS的协议详解
SBUS 1.串口配置: 100k波特率, 8位数据位(在stm32中要选择9位), 偶校验(EVEN), 2位停止位, 无控流,25个字节, 2.协议格式: [startbyte] [data1][data2]……...
【PyTorch】教程:torch.nn.Hardshrink
torch.nn.Hardshrink CLASS torch.nn.Hardshrink(lambd0.5) 参数 lambd ([float]) – the λ\lambdaλ 默认为 0.5 定义 HardShrink(x){x,if x>λx,if x<−λ0,otherwise \text{HardShrink}(x) \begin{cases} x, & \text{ if } x > \lambda \\ x, & \text{…...
JavaScript 函数参数
JavaScript 函数对参数的值(arguments)没有进行任何的检查。JavaScript 函数参数与大多数其他语言的函数参数的区别在于:它不会关注有多少个参数被传递,不关注传递的参数的数据类型。函数显式参数与隐藏参数(arguments)在先前的教程中,我们已…...
【C】标准IO库函数
fopen/fclose #include <stdio.h>FILE *fopen(const char *path, const char *mode); 返回值:成功返回文件指针,出错返回NULL并设置errnoint fclose(FILE *fp); 返回值:成功返回0,出错返回EOF并设置errnomode参数是一个字符…...
http客户端Feign
Feign替代RestTemplate RestTemplate方式调用存在的缺陷 String url"http://userservice/user/"order.getUserId();User user restTemplate.getForObject(url, User.class); 代码可读性差,变成体验不统一; 参数复杂的时候URL难以维护。 &l…...
如何在Java中使用枚举类:从入门到进阶
枚举类是Java中一种特殊的数据类型,它允许我们将一组有限的值作为一组常量来使用,这些常量在代码中具有固定的名称和类型。在Java中,枚举类通常用于代表状态、选项和类别等具有离散值的变量。本篇博客将深入探讨Java中的枚举类,包…...
操作系统(1.2)--引论
目录 一、操作系统的基本特性 1.并发性 1.1 并行与并发 1.2 引入进程 2.共享性 2.1 互斥共享方式 2.3 同时访问方式 3.虚拟 3.1 时分复用技术 4. 异 步 二、操作系统的主要功能 1.处理机管理功能 1.1 进程控制 1.2 进程同步 1.3 进程通信 1.4 调度 2. 内…...
【Linux】 shell if的[]和[[]]区别
文章目录[]和test[]和[[]]区别总结参考[]和test Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试 test常用于 if ,作为判断条件,if test等价于 if [ ],因此,test和[] 内的内…...
利用flask解析海康摄像头视频
利用flask解析海康摄像头视频利用flask解析海康摄像头和大华摄像头的视频一、安装依赖包二、获取海康摄像头视频流三、将视频流输出到Web页面四、 创建HTML模板文件利用flask解析海康摄像头和大华摄像头的视频 作为AI智能的一种应用场景,视频监控系统已经在各个行业…...
浙江省建设工程质量安全协会网站/希爱力的作用与功效
Python模块的进阶! 今天博主跟大家聊一聊如何使用Python模块的进阶!不喜勿喷,如有建议欢迎补充、讨论! 关于安装和汉化可以观看博主的这篇文章《下载安装及汉化 》以及Python系列:windows10配置Python3.0开发环境&…...
v2017网站开发/外包客服平台
文章目录1.STL容器简介1.1STL介绍1.2容器分类2.向量vector2.1定义和初始化2.2常用操作2.3遍历操作3.列表list3.1定义和初始化3.2常用操作3.3遍历操作3.4实例程序4.双端队列deque4.1定义和初始化4.2常用操作4.3实例操作5.集合set5.1定义和初始化5.3常用操作5.4遍历操作5.5实例操…...
网站建设 慕课/网络营销与网站推广的
流程: 17年底,mask-R CNN DPM、R-CNN、YOLO、SSD 1、基于传统图像处理和机器学习算法的目标检测与识别方法 传统的目标检测与识别方法主要可以表示为:目标特征提取->目标识别->目标定位。 这里所用到的特征都是认为设计的,例如SIFT (尺…...
java做网站的要求/刷网站关键词工具
大家好,我是小马老师。 本文介绍如何使用lammps计算径向分布函数g。 径向分布函数(Radial distribution function)是指给定某个粒子的坐标,其他粒子在空间的分布几率。 在lammps中对应的命令为:compute rdf。 语法格式…...
wordpress的开发者/自己建网站要多少钱
一.为什么学习节点操作 获取元素通常使用两种方式: 1.利用DOM提供的方法获取元素 document.getElementByld()document.getElementsByTagName()document.querySelector等逻辑性不强、繁琐 2.利用节点层级关系获取元素 利用父子兄节点关系获…...
关于建设网站的培训知识/推广网站seo
西雅图IT圈:seattleit【今日作者】栗头蓝一个充满着人文情怀的web前端相声演员特朗普的移民政策让那些新近H-1B签证申请人的日子越来越难过了有多难过?美国移民局2018年最后三个月的数据显示,有四分之一的H-1B申请被拒。对比四年前࿰…...