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

初识C++入门(1)

为什么会衍生出C++?

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了00P(object oriented programming: 面向对象)思想,支持面向对象的程序设计语言应运而生。


1982年,Biarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了-种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此: C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计(这也是C++兼容C语言的原因),又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

C++祖师爷的介绍

本贾尼·斯特劳斯特卢普(Bjarne Stroustrup,1950年6月11日-),丹麦人,计算机科学家,在德克萨斯A&M大学担任计算机科学的主席教授。他最著名的贡献就是开发了C++程序设计语言。

1982年,美国AT&T公司贝尔实验室的本贾尼博士在C语言的基础上引入并扩充了面向对象的概念,发明了—种新的程序语言。为了表达该语言与C语言的渊源关系,它被命名为C++。而本贾尼博士被尊称为C++语言之父。

1979 年,贝尔实验室的本贾尼等人试图分析 unix 内核的时候,试图将内核模块化,于是 C
语言的基础上进行扩展,增加了类的机制 ,完成了一个可以运行的预处理程序,称之为 C with
classes 。C++也是在不断更新的(完善和添加新语法等等)
C++还在不断发展, 但现在公司主流使用的还是C++98和C++11,目前重点掌握这两个即可,其他的版本语法可以等待工作以后随着对C++理解不断加深,再去了解其他版本语法特性。
C++的重要性
下图数据来自TIOBE编程语言社区202112月最新的排行榜,  在30多年的发展中,C/C++几乎一
致稳居前5。
在工作领域中C++的作用
1. 操作系统以及大型系统软件开发
所有操作系统几乎都是 C/C++ 写的,许多大型软件背后几乎都是 C++ 写的,比如:
Photoshop Office JVM(Java 虚拟机 )等,究其原因还是性能高,可以直接操控硬件。
2. 服务器端开发 后台开发:主要侧重于业务逻辑的处理,即对于前端请求后端给出对应的响应,现在主流采 用java ,但内卷化比较严重,大厂可能会有 C++ 后台开发,主要做一些基础组件,中间件、 缓存、分布式存储等。服务器端开发比后台开发跟广泛,包含后台开发,一般对实时性要求
比较高的,比如游戏服务器、流媒体服务器、网络通讯等都采用 C++ 开发的。
3. 游戏开发
PC 平台几乎所有的游戏都是 C++ 写的,比如:魔兽世界、传奇、 CS 、跑跑卡丁车等,市面上
相当多的游戏引擎都是基于 C++ 开发的,比如: Cocos2d 、虚幻 4 DirectX 等。三维游戏领
域计算量非常庞大,底层的数学全都是矩阵变换,想要画面精美、内容丰富、游戏实时性
搞,这些高难度需求无疑只能选 C++ 语言。比较知名厂商:腾讯、网易、完美世界、巨人网
络等。
4. 嵌入式和物联网领域
嵌入式:就是把具有计算能力的主控板嵌入到机器装置或者电子装置的内部,能够控制这些
装置。比如:智能手环、摄像头、扫地机器人、智能音响等。
谈到嵌入式开发,大家最能想到的就是单片机开发 ( 即在 8 位、 16 位或者 32 位单片机产品或者
裸机上进行的开发 ) ,嵌入式开发除了单片机开发以外,还包含在 soc 片上、系统层面、驱动
层面以及应用、中间件层面的开发。
常见的岗位有:嵌入式开发工程师、驱动开发工程师、系统开发工程师、 Linux 开发工程
师、固件开发工程师等。
知名的一些厂商,比如:以华为、 vivo oppo 、小米为代表的手机厂;以紫光展锐、乐鑫为
代表的芯片厂;以大疆、海康威视、大华、 CVTE 等具有自己终端业务厂商;以及海尔、海
信、格力等传统家电行业。
随着 5G 的普及,物联网 ( 即万物互联, ) 也成为了一种新兴势力,比如:阿里 lot 、腾讯 lot 、京
东、百度、美团等都有硬件相关的事业部。
5. 数字图像处理
数字图像处理中涉及到大量数学矩阵方面的运算,对 CPU 算力要求比较高,主要的图像处理
算法库和开源库等都是 C/C++ 写的,比如: OpenCV OpenGL 等,大名鼎鼎的 Photoshop
就是 C++ 写的。
6. 人工智能
一提到人工智能,大家首先想到的就是 python ,认为学习人工智能就要学习 python ,这个
是误区, python 中库比较丰富,使用 python 可以快速搭建神经网络、填入参数导入数据就
可以开始训练模型了。但人工智能背后深度学习算法等核心还是用 C++ 写的。
7. 分布式应用
近年来移动互联网的兴起,各应用数据量业务量不断攀升;后端架构要不断提高性能和并发
能力才能应对大信息时代的来临。在分布式领域,好些分布式框架、文件系统、中间组件等
都是 C++ 开发的。对分布式计算影响极大的 Hadoop 生态的几个重量级组件: HDFS
zookeeper HBase 等,也都是基于 Google C++ 实现的 GFS Chubby BigTable 。包括分
布式计算框架 MapReduce 也是 Google 先用 C++ 实现了一套,之后才有开源的 java 版本。
除了上述领域外,在:科学计算、浏览器、流媒体开发、网络软件等都是C++比较适合的场景,
作为一名老牌语言的常青树,C++一直霸占编程语言前5名,肯定有其存在的价值。
C++的介绍就到这里吧!你还记得学习C语言第一节课在电脑屏幕上输出hello world的喜悦感吗?
接下来我们以C++的形式输出hello world!
#include<iostream>
using namespace std;int main()
{cout << "hello world" << endl;return 0;
}

我们先不用看懂全部代码 比如using namespace std;cout <<endl是什么意思?

咱们不急,先听我娓娓道来,我会在下面解释到的,解开困惑的

第一个知识 命名空间 namespace

当我们用C语言运行这段代码会出现报错

#include<stdio.h>
#include<stdlib.h>
int rand = 10;int main()
{printf("%d ", rand);return 0;
}

为什么呢?因为在头文件<stdlib.h>库里面就包含了rand函数,我们再次使用rand定义了全局变量,因此会出现命名冲突,但C语言无法解决这种命名冲突问题,所以C++祖师爷为了解决命名冲突问题提出了namespace来解决。

命名空间一般用namespace+自己定义名字

比如我使用的是namespace as (as就是命名空间的名字)

用%p访问rand是因为rand是头文件里面的rand函数 编译器会推荐用%p访问

#include<stdio.h>
#include<stdlib.h>namespace as
{int rand = 10;
}
int main()
{printf("%p", rand);return 0;
}

那怎么访问命名空间里面的rand的值呢?

使用 : :域作用限定符来访问

#include<stdio.h>
#include<stdlib.h>namespace as
{int rand = 10;
}
int main()
{printf("%p", rand);printf("%d", as::rand);return 0;
}

命名空间相当于用围墙把rand"保护了起来"且留了一个入口,入口上面有牌匾"里面有恶犬 生人勿近 会咬人",只能有熟人进去喂"它(rand)"食物和与它互动。

#include<stdio.h>
#include<stdlib.h>namespace as
{int rand = 10;struct Node{struct Node* next;int val;};int Add(int left, int right){return left + right;}
}
int main()
{printf("%p\n", rand);printf("%d\n", as::rand);printf("%d\n", as::Add(2, 3));struct as::Node node;return 0;
}

假设同一个命名空间有相同的变量会怎么样呢?会不会自己和自己打一架?

实际上命名空间是可以嵌套的

#include<stdio.h>
#include<stdlib.h>namespace as
{int rand = 10;namespace as1{int rand = 30;}namespace as2{int rand = 20;}struct Node{struct Node* next;int val;};int Add(int left, int right){return left + right;}
}
int main()
{printf("%p\n", rand);printf("%d\n", as::rand);printf("%d\n", as::as1::rand);printf("%d\n", as::as2::rand);printf("%d\n", as::Add(2, 3));struct as::Node node;return 0;
}

比如你在公司需要写项目比如栈,为了防止与同事写的冲突就可以运用命名空间

Stack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>namespace fk
{typedef struct Stack{int* a;int sz;int capacity;}ST;void STInit(ST* ps);void STPush(ST* ps,int x);
}test.cpp
#include"Stack.h"namespace fk
{void STInit(ST* ps){ps->a = NULL;ps->capacity = ps->sz = 0;}void STPush(ST* ps, int x){//....}
}int main()
{fk::ST st;fk::STInit(&st);fk::STPush(&st, 1);fk::STPush(&st, 2);fk::STPush(&st, 3);
}

那么它们运行起来不会冲突吗?

  同一个工程中允许存在多个相同名称的命名空间 , 编译器最后会合成同一个命名空间中。
一个工程中的 test.h 和上面 test.cpp 中两个fk 会被合并成一个。
当我们每次访问栈的时候都要使用命名空间名称+域作用限定符是不是有点太麻烦了?
有没有什么方法能直接访问呢?
这个时候就有了 usingnamesapce+命名空间名称 上面我们用C++输出hello world时候运用到了这个
test.cpp
#include"Stack.h"namespace fk
{void STInit(ST* ps){ps->a = NULL;ps->capacity = ps->sz = 0;}void STPush(ST* ps, int x){//....}
}using namespace fk;
int main()
{ST st;STInit(&st);STPush(&st, 1);STPush(&st, 2);STPush(&st, 3);
}

只需要在test.cpp写上一句 using namespace fk;即可

那么using namespace std;是什么意思呢?

std是C++官网标准库的命名空间,当我们展开std时,库里面的函数就可以使用了

那么std库里面的函数能随意展开吗?答案是否定的

在我们平常练习C++时可以展开自己定义的命名空间和std库的命名空间,但在实际工程上是不能随意展开的,容易出现冲突。

#include<iostream>是C++的头文件 类似于C语言的#include<stdio.h>

i=In O=Out 输入与输出 <<是流插入

C++为了有自己的换行符有了endl  endl=end line.

#include<iostream>int main()
{//<< 是流插入int a = 10;std::cout << a << "\n";int b = 20;double e = 13.14;// << 可以自动识别数据类型int c = 545;std::cout << b<< "\n";std::cout << e << "\n";std::cout << c << std::endl;return 0;
}

 

在我们不展开C++的库函数时,只能用域作用限定符来cout和endl,例如std::cout std::endl

但每次指定命名空间不方便,又害怕C++库里面函数全部暴露 又有风险冲突?

那么怎么办呢?我们可以指定展开命名空间 例如下图

#include<iostream>
using std::cout;
using std::endl;
int main()
{//<< 是流插入int a = 10;cout << a << "\n";int b = 20;double e = 13.14;// << 可以自动识别数据类型int c = 545;cout << b<< "\n";cout << e << "\n";cout << c << endl;return 0;
}

 

 

cout中的C=console(控制台) cin是流提取 相当于C语言的scanf

#include<iostream>
using std::cout;
using std::endl;
int main()
{int a = 20;int b = 30;cout << a << endl << b << endl;std::cin >> a >> b;return 0;
}

 

如果要控制数字精度怎么办呢?使用C,因为C++兼容C

#include<iostream>
using std::cout;
using std::endl;
int main()
{int a = 20;int b = 30;double c = 13.1424;cout << a << endl << b << endl;//控制精度用C 因为C++兼容Cprintf("%.1lf\n", c);return 0;
}

相关文章:

初识C++入门(1)

为什么会衍生出C&#xff1f; C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c;20世纪80年代&#xff0c;计算机界提出…...

使用Selenium的WebDriver进行长截图

from selenium import webdriver from PIL import Image from io import BytesIO # 创建浏览器驱动 driver webdriver.Chrome()# 打开网页 driver.get("https://www.douban.com/") # 替换为您要截图的网页URL def get_long_shot(driver,table_element):# 获取页面的…...

python+大数据校园卡数据分析 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&am…...

【机器学习】sklearn降维算法PCA

文章目录 降维PCAsklearn中的PCA代码实践 PCA对手写数字数据集的降维 降维 如何实现降维&#xff1f;【即减少特征的数量&#xff0c;又保留大部分有效信息】 将那些带有重复信息的特征合并&#xff0c;并删除那些带无效信息的特征等等&#xff0c;逐渐创造出能够代表原特征矩…...

华为云云耀云服务器L实例评测|企业项目最佳实践之评测用例(五)

华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践系列&#xff1a; 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之云服务器介绍(一) 华为云云耀云服务器L实例评测&#xff5c;企业项目最佳实践之华为云介绍(二) 华为云云耀云服务器L实例评测&#xff5…...

Xcode升级到15.0 解决DT_TOOLCHAIN_DIR问题

根据个人开发遇到的问题做的总结&#xff0c;公司要求Xcode 14.2 &#xff0c;Swift 5.7开发&#xff0c;由于升级了Mac 14.0系统后&#xff0c;Xcode 14.2不能使用&#xff0c;解决方案目前有2个 一、在原来Xcode 14.2 的显示包内容&#xff0c;如图 二、升级到Xcode的15.0后…...

小谈设计模式(29)—访问者模式

小谈设计模式&#xff08;29&#xff09;—访问者模式 专栏介绍专栏地址专栏介绍 访问者模式角色分析访问者被访问者 优缺点分析优点将数据结构与算法分离增加新的操作很容易增加新的数据结构很困难4 缺点增加新的数据结构比较困难增加新的操作会导致访问者类的数量增加34 总结…...

【25】c++设计模式——>责任链模式

责任链模式定义 C中的责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过将请求沿着处理对象的链传递来避免把请求发送者与接收者耦合在一起。 责任链模式的主要思想是&#xff0c;通过将多个处理对象组成一条链&…...

GlobalTransactional

seata-spring的maven坐标&#xff1a; <dependency><groupId>io.seata</groupId><artifactId>seata-spring</artifactId><version>1.6.1</version> </dependency>GlobalTransactional注解的位置&#xff1a; io.seata.sprin…...

Android Studio运行kotlin项目,一直Read timed out

Android Studio运行kotlin项目&#xff0c;一直Read timed out 下载别人的Kotlin项目&#xff0c;导入as后&#xff0c;运行app一直失败&#xff0c;提示Read timed out&#xff0c;有2种解决办法 第一种方式&#xff1a;gradle.properties 修改kotlin项目种的gradle.proper…...

Excel 的单元格内容和单元格格式

文章目录 单元格内容单元格格式常规格式数字格式 单元格内容 文本&#xff1a;只要不是纯数字&#xff0c;Excel 都默认是文本格式。 在 Excel 中&#xff0c;逻辑值只有两个&#xff1a;True 和 False。 全选一片区域&#xff0c;按 Delet 键删除内容时&#xff0c;确实可以删…...

4大软件测试策略的特点和区别(单元测试、集成测试、确认测试和系统测试)

四大软件测试策略分别是单元测试、集成测试、确认测试和系统测试。 一、单元测试 单元测试也称为模块测试&#xff0c;它针对软件中的最小单元&#xff08;如函数、方法、类、模块等&#xff09;进行测试&#xff0c;以验证其是否符合预期的行为和结果。单元测试通常由开发人…...

armbian 安装mysql

1、执行安装指令 sudo apt-get update sudo apt-get install mysql-server 2、安装成功后&#xff0c;设置密码 ALTER USER root% IDENTIFIED WITH mysql_native_password BY ysw1234; flush privileges;3、设置允许远程连接并生效 use mysql; update user set host % whe…...

Ubuntu22常用软件

别存太多重要东西在Ubuntu &#xff0c;硬盘损坏就麻烦 Tweaks自定义UI sudo apt intall gnome-tweaks为了方便管理和添加&#xff0c;还需添加&#xff1a; sudo apt install gnome-shell-extension-prefs gnome-shell-extension-manager -y1.打开Extension应用&#xff0c;添…...

【CFD小工坊】浅水模型的边界条件

【CFD小工坊】浅水模型的边界条件 前言处理边界条件的原则边界处水力要素的计算水位边界条件单宽流量边界条件流量边界条件固壁边界条件 参考文献 前言 在浅水方程的离散及求解方法一篇中&#xff0c;我们学习了三角形网格各边通量值及源项的求解。但仍有一个问题没有解决&…...

电力物联网关智能通讯管理机-安科瑞黄安南

众所周知&#xff0c;网关应用于各种行业的终端设备的数据采集与数据分析&#xff0c;然后去实现设备的监测、控制、计算&#xff0c;为系统与设备之间建立通讯联系&#xff0c;达到双向的数据通讯。 网关可以实时监测并及时发现异常数据&#xff0c;同时自身根据用户规则进行…...

用Flask构建一个AI翻译服务

缘起 首先&#xff0c;看一段代码&#xff0c;只有几行Python语句却完成了AI翻译的功能。 #!/usr/bin/python3import sys from transformers import MarianMTModel, MarianTokenizerdef translate(word_list):model_name "Helsinki-NLP/opus-mt-en-zh"tokenizer …...

微信小程序引入阿里巴巴iconfont图标并使用

介绍 在小程序里&#xff0c;使用阿里巴巴的图标&#xff0c;如下所示: 使用方式 搜索自己需要的图标&#xff0c;然后将需要用到的图标加入购物车&#xff0c;如下图所示&#xff1a; 去右上角&#xff0c;点击购物车按钮&#xff1b;这里第一次使用&#xff0c;会有三个提…...

mysql面试题49:MySQL中不同text数据类型的最大长度

该文章专注于面试&#xff0c;面试只要回答关键点即可&#xff0c;不需要对框架有非常深入的回答&#xff0c;如果你想应付面试&#xff0c;是足够了&#xff0c;抓住关键点 面试官&#xff1a;MySQL中TEXT数据类型的最大长度 在MySQL中&#xff0c;TEXT数据类型用于存储较大…...

从虚拟电厂在上海的实践探索看企业微电网数字化的意义

安科瑞 华楠 作为典型的人口聚集、负荷密集区域&#xff0c;上海市具有外来电比例高、本地资源禀赋不足的特点。从发电侧角度来看&#xff0c;近年来上海风、光等新能源发电装机比例逐年提升&#xff0c;传统的火电逐渐成为调节性发电资源&#xff1b;从负荷侧角度来看上海以第…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置&#xff1a;遍历整个矩阵&#xff0c;找出所有值为 0 的元素&#xff0c;并将它们的坐标记录在数组zeroPosition中置零操作&#xff1a;遍历记录的所有 0 元素位置&#xff0c;将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...