C++篇:C向C++迈进(上)

news2024/11/14 22:01:34

引言

C语言作为编程基石,其高效与直接性深受开发者喜爱。然而,随着软件复杂度的增加,C++以其面向对象及高级特性成为了新的选择。我们接下来将学习C++,从C语言迈向C++。

什么是C++

C++ 是一种高级语言,由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发。它进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言,可运行于多种平台上,如 Windows、MAC 操作系统以及 UNIX 的各种版本。

C++完善了C语言的许多缺陷,并且引入了面向对象的程序设计思想,包括面向对象的四个特性:封装继承多态抽象。

C++的组成

C++作为一种强大的编程语言,其组成可以从多个维度进行解析。从核心组成部分的角度来看,C++主要由以下三个重要部分组成:

1.C++语言核心:这是C++的基础,包括了C++的基础语法和语义。例如,变量、数据类型(如整型、浮点型、字符型等)、控制结构(如if语句、循环语句等)、函数、类和对象等基本概念和特性都属于C++语言核心。这些元素共同构成了C++程序的基本框架和逻辑结构。

2.C++标准库:C++标准库提供了一系列预定义的函数和类,用于执行常见的编程任务。这些库函数和类覆盖了广泛的领域,包括字符串处理、类型转换、文件操作、时间日期处理、数学运算等。

3.标准模板库(STL):STL是C++标准库的一个重要组成部分,它提供了一系列模板类和函数,用于实现各种数据结构和算法。

我们后面的学习主要围绕这三部分进行。

C++版本更新

阶段内容
带类的C(C with Classes)是在C语言的基础上增加了类(class)的机制
C++ 1.0虚函数、函数和运算符重载、引用等概念
C++2.0更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静态成员以及const成员函数
C++3.0进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处理
C++98C++官方第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美国标准化协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)
C++03C++标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
C++11引入了对象移动、右值引用、lambda表达式、编译时类型识别(auto)、别名模板等现代编程语言常具备的能力
C++14对C++11的重要补充和优化,引入了二进制文字常量、将类型推导从Lambda函数扩展到所有函数等
C++17引入了类模板参数推导、UTF-8文字常量、fold表达式等新特性
C++20入了许多新的特性,比如:模块(Modules)、协 (Coroutines)、范围(Ranges)、概念(Constraints)等重大特性,还有对已有 特性的更新:比如Lambda支持模板、范围for支持初始化等

C++20标准中增加了很多新特性,这些特性虽然能够提高开发效率,但需要相应的编程经验和技巧来掌握。C++本身的复杂性和学习难度就较大,因此新特性的引入进一步增加了学习成本。

现在公司主流使用的是C++98C++11两个标准。

C++在工作领域的应用

C++的应用领域服务器端、游戏(引擎)、机器学习引擎、音视频处理、嵌入式软件、电信设备、金融应用、基础库、操作系统、编译器、基础架构、基础工具、硬件交互等很多方面都有。

1. 大型系统软件开发。如编译器、数据库、操作系统、浏览器等等。
2. 音视频处理。常见的音视频开源库和方案有FFmpeg、WebRTC、Mediasoup、ijkplayer,音视频开发最主要的技术栈就是C++。
3. PC客户端开发。一般是开发Windows上的桌面软件,如WPS之类的,技术栈的话⼀般是C++和QT,QT是⼀个跨平台的 C++ 图形用户界面(Graphical  User  Interface,GUI)程序。
4. 服务端开发。各种大型应用网络连接的高并发后台服务。这块Java也比较多,C++主要用于⼀些对性能要求比较高的地方。如:游戏服务、流媒体服务、量化高频交易服务等。
5. 游戏引擎开发。很多游戏引擎就都是使用C++开发的,如虚幻引擎,游戏开发要掌握C++基础和数据结构,学习图形学知识,掌握游戏引擎和框架,了解引擎实现,引擎源代码可以学习UE4、Cocos2d-x等开源引擎实现。
6. 嵌入式开发。嵌入式把具有计算能力的主控板嵌入到机器装置或者电子装置的内部,通过软件能够控制这些装置。
7. 机器学习引擎。机器学习底层的很多算法都是用 C++ 实现的,上层用 python 封装起来。
8. 测试开发/测试。每个公司研发团队,有研发就有测试,测试主要分为测试开发和功能测试,测试开发⼀般是使用⼀些测试工具(selenium、Jmeter等),设计测试用例,然后写⼀些脚本进行自动化测试,性能测试等,有些还需要自行开发⼀些测试用具。功能测试主要是根据产品的功能,设计测试用例,然后手动的方式进行测试。

C++的关键字

C++有63个关键字,如下所示:

C++的第一个程序

C++兼容C语言绝大多数的语法,所以C语言实现的hello world依旧可以运行,C++中需要把定义文件代码后缀改为.cpp,vs编译器看到是.cpp就会调用C++编译器编译。

C语言代码:

#include<stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

C++的标准输入与输出函数是cincout,分别对应C语言的printf与scanf。但是相较于C语言,C++输入输出并不需要指定占位符,如:%d,%c等。

C++代码:

#include<iostream>
using namespace std;
int main()
{
    cout << "hello world" << endl;
    return 0;
}

接下来我们会来分析这段代码的各个部分。

命名空间

命名空间是C++中用于组织代码的一种机制,它提供了一种将库中的名称封装起来的方法,从而避免了全局命名空间的污染。简单来说,命名空间就像是一个容器,里面可以包含函数、变量、类型等标识符(即名称),而这些标识符在命名空间外部是不可见的,除非通过特定的方式(如使用命名空间的名称作为前缀,或使用using声明/指令)来访问。

1.定义命名空间

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{ }即可,{ }中即为命名空间的成员。

基本语法:

namespace namespace_name 
{  
    // 在这里声明变量、函数、类型等  
}

来看个简单的例子:

namespace a
{
	int rand = 10;
}

int main()
{
	std::cout << a::rand << std::endl
	return 0;
}

2.命名空间的使用

在我们定义完命名空间之后,我们需要对其进行访问。

(1)域作用限定符

域作用限定符(Scope Resolution Operator),在C++中通常使用双冒号 :: 来表示,它主要用于指定变量、函数、类型等标识符所属的特定作用域。这个操作符在C++编程中扮演着重要的角色,尤其是在处理命名冲突、访问全局变量或命名空间中的成员时。

看个简单的例子:

namespace b 
{
    int a = 10;
}

void func() 
{
    int a = 20;
    std::cout << b::a << std::endl; // 输出全局变量a的值  
    std::cout << a << std::endl;    // 输出局部变量a的值  
}

:: 通知编译器应从作用域限定符左侧的名字所示的作用域中寻找右侧那个名字,即指定访问哪个名字空间的哪个成员。当左侧为空时,默认访问的就是全局域。

例如这样:

#include<iostream>
int a = 10;
void func()
{
	int a = 20;
	printf("%d\n", a);      // 输出局部变量
	printf("%d\n", ::a);    // 输出全局变量
}

int main()
{
    func();
	return 0;
}

我们接下来试试访问C++标准命名空间。(cout,endl等常用函数都被定义在C++标准命名空间std中)。

#include<iostream>
int main()
{
	std::cout << "hello world" << std::endl;
	return 0;
}

输出结果:

(2)使用using声明

using声明可以在局部作用域(如函数内部)或命名空间作用域中引入命名空间的一个或多个成员。这使得在当前作用域内可以直接使用这些成员,而不需要前缀。

使用方式为  using 命名空间名称:: 成员。

namespace c 
{
    int x = 42;
}

void func() 
{
    using c::x; // 引入命名空间中的一个成员  
    std::cout << x << std::endl; // 现在可以直接使用x  
}
(3)使用using namespace

由于cout,endl等常用函数都被定义在C++标准命名空间std中,我们可以使用using namespace使得命名空间中的所有成员都可以直接使用,而不需要前缀。

#include<iostream>
using namespace std;
int main()
{
    cout << "hello world" << endl;
    return 0;
}

 然而,这种做法在全局作用域或头文件中通常是不推荐的,因为它可能导致命名冲突。

日常小练习程序为了方便推荐使用。
 

3.命名空间的嵌套

命名空间可以嵌套定义,这意味着一个命名空间内部可以定义另一个命名空间。这种结构有助于进一步组织代码,特别是在大型项目中,它允许开发者将相关的功能或库按逻辑分组。

当访问嵌套命名空间中的成员时,需要使用外层命名空间的名称作为前缀,然后是内层命名空间的名称,最后才是成员的名称。这可以通过连续使用作用域解析运算符(::)来实现。

来看个简单的例子:

namespace bit
{
	int rand = 10;

	int Add(int num1, int num2)
	{
		return num1 + num2;
	}

	namespace a
	{
		int rand = 1;
	}

	namespace b
	{
		int rand = 2;
	}
}

int main()
{
	printf("%d\n", bit::Add(1, 1));

	printf("a:%d\n", bit::a::rand);
	printf("b:%d\n", bit::b::rand);

	return 0;
}

4.命名空间的合并

在同一个工程中多个名称相同的命名空间,在编译时命名空间会自动合并。

namespace c
{
	int a = 1;
}
namespace c
{
	int b = 1;
}
//编译时会自动合并

C++的输入输出

<iostream>是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输
出对象。

std::cin 是 istream 类的对象,它主要面向窄字符的标准输入流。

std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。

std::endl 是⼀个函数,流插入输出时,相当于插入⼀个换行字符加刷新缓冲区。

 << 是流插入运算符, >> 是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)。IO流涉及类和对象,运算符重载、继承等很多面向对象的知识,我们在后续的学习中也会接触到。

cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要
通过命名空间的使用方式去用它们。

注意:⼀般日常练习中我们可以using namespace std,实际项目开发中不建议using namespace std。

结束语

这算是迈向C++的第一步~

感谢各位大佬的支持!!!

求点赞收藏关注!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2073936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker 的简介

Docker 的简介 为什么会有 Docker环境一致性问题提高资源利用率和可移植性快速部署和伸缩简化管理和维护版本控制和回滚 Docker 的历史dotCloud 时代&#xff08;2010年前&#xff09;Docker 诞生&#xff08;2010-2013&#xff09;快速发展与开源&#xff08;2013-2014&#x…

mysql 日期字段自动填写日期 及自动更新日期

INSERT 时 自动给日期字段 添加 当前日期时间&#xff1a; 在默认里选中&#xff1a; CURRENT_TIMESTAMP UPDATE 时 自动给日期字段 更新 当前日期时间&#xff1a; 勾选&#xff1a;根据当前时间戳更新

通过VIN车架号查询车辆登记日期

我们先来介绍下什么是vin码&#xff0c;以及vin码的构成结构解析&#xff0c;汽车VIN码&#xff0c;也叫车辆识别号码&#xff0c;通俗可以理解为汽车的身份证号码。 接口介绍 通过17位vin码&#xff0c;获取到车辆的发动机号&#xff0c;初登日期&#xff0c;车辆型号等信息。…

CI/CD之Jenkins用于Linux系统的部署方式汇总

目录 一、前言 二、CI/CD的定义与核心原则 CI/CD在现代软件开发中的重要性 CI/CD与Jenkins的关系 三、Jenkins部署方式汇总 1. 独立服务器部署 &#xff08;1&#xff09;离线安装 &#xff08;2&#xff09;在线安装 2. Docker容器部署 3. Kubernetes集群部署 4. 云…

聚焦自闭儿童:关注与理解

在探讨一个三岁自闭症孩子不会说话的情况时&#xff0c;我们首先需要理解自闭症这一复杂神经发育障碍的本质&#xff0c;以及它如何影响儿童的社交互动、沟通能力和行为模式。自闭症不仅仅是一个简单的“不会说话”的问题&#xff0c;而是一系列症状的综合体现&#xff0c;这些…

机器学习:随机森林决策树学习算法及代码实现

1、概念 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;它通过构建多个决策树来进行分类或回归预测。随机森林的核心原理是“集思广益”&#xff0c;即通过组合多个弱学习器&#xff08;决策树&#xff09;的预测结果来提高整体模型的准确性和健…

基于Java的小区物业管理系统APP的设计与实现(论文+源码)_kaic

摘 要 小区物业管理系统是现代社会中非常热门的软件&#xff0c;伴随着社区规模的不断扩大和住户的不断增多&#xff0c;本系统的主要目的是辞别帐本以及传统的单一数据管理系统&#xff0c;快捷的保存用户各种数据信息。本系统针对Java系统展开&#xff0c;使用Java、SpringB…

tomcat服务器相关搭建

文章目录 web应用服务器tomcatTomcat功能及介绍配置tomcat服务器生成tomcat启动文件 nginx反向代理session共享服务器 web应用服务器tomcat Tomcat功能及介绍 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和…

香橙派AIPro开发板安装PyQt5 aarch64

香橙派AIPro开发板安装PyQt5 参考 开发板信息 官网开发板信息 软件环境信息 1、安装依赖环境 sudo apt-get install cmake gcc g pip3 install --upgrade pip pip3 install wheel setuptools sudo apt-update sudo apt-get install qt5-default sudo apt-get install qtd…

为什么互联网上要设立防火墙?WAF又是什么?

防火墙&#xff08;英语&#xff1a;Firewall&#xff09;技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备&#xff0c;帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障&#xff0c;以保护用户资料与信息安全性的一种技术。 防火墙技术的功能主要在于及…

python库(21):

1 TextBlob简介 TextBlob 是一个基于 Python 的文本处理库&#xff0c;能够让基础的自然语言处理任务变得异常简单。 它提供了一个简单直观的 API&#xff0c;让你能够轻松执行词性标注、名词短语提取、情感分析、文本分类和关键词提取等功能。 值得一提的是&#xff0c;Tex…

计算机网络计算题【408】——里昂视频

计算机网络【408】计算题 计算机网络概述【17题】【18题】甘特图【19题】甘特图【20题】【21题】 通信基础【14】求最大传输速率使用两个公式【27】【28】【29】差分曼彻斯特【30】[21]重点 p14 通信基础T31 流量控制与可靠传输机制T21 选择重传协议[GBN]:SR [22][24]***⭐【25…

linux系统使用 docker 来部署web环境 nginx+php7.4 并配置称 docker-compose-mysql.yml 文件

Docker是一个开源的容器化平台&#xff0c;旨在简化应用程序的创建、部署和管理。它基于OS-level虚拟化技术&#xff0c;通过将应用程序和其依赖项打包到一个称为容器的标准化单元中&#xff0c;使得应用程序可以在任何环境中快速、可靠地运行。 Docker的优势有以下几个方面&a…

通用定时器,输入捕获

这个图片主要看评论 这个是定时器输入捕获的基本配置步骤&#xff0c;主要也是看评论 注意&#xff1a;输入捕获开了两个中断&#xff0c;一个是捕获中断&#xff0c;只要有上升沿或者下降边沿或者双边沿&#xff0c;&#xff08;主要看设置的捕获什么边沿&#xff09;&#x…

【Python 千题 —— 基础篇】图形的面积(圆形)

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 编写一个面向对象的程序,定义一个 Circle 类,该类有一个属性 radius(圆的半径),并具有一个方法 area() 来计算圆的面积。请根据以下要求实…

IM项目:进阶版即时通讯项目---文件存储和消息转发

文章目录 文件传输服务基本功能模块划分流程图实现逻辑代码实现 消息转发功能设计模块划分获取转发目标和消息处理代码实现 文件传输服务 基本功能 文件的上传文件的下载 模块划分 基于gflags进行参数和配置文件的解析基于spdlog进行日志输出基于etcd进行服务注册基于brpc进…

关于超长字符串/文本对应的数据从excel导入到PL/SQL中的尝试

问题&#xff1a; 1.字符串太长 2.str绑定之的结尾null缺失 将csv文件导入到PL/SQL表中存在的一些问题 1.本来我是需要将exceL上的几十条数据导入到PL/SQL数据库的一张表中&#xff0c;结果我花了许多时间 去导入。 想想一般情况下也就几十条数据&#xff0c;直接复制粘贴就…

并发编程之----线程池ThreadPoolExecutor,Excutors的使用及其工作原理

当前&#xff1a;并发编程之----线程池ThreadPoolExecutor,Excutors的使用及其工作原理 Redis高级----主从、哨兵、分片、脑裂原理-CSDN博客 计算机网络--面试知识总结一 计算机网络-----面试知识总结二 计算机网络--面试总结三&#xff08;Http与Https&#xff09; 计算机…

代码随想录 | 回溯算法总结

在代码随想录算法 | 回溯算法先导知识 | 题目分类&#xff0c;理论基础-CSDN博客中我们详细的介绍了回溯算法的理论知识&#xff0c;不同于教科书般的讲解&#xff0c;这里介绍的回溯法的效率&#xff0c;解决的问题以及模板都是在刷题的过程中非常实用&#xff01; 回溯是递归…

黑神话悟空|风灵月影 35项修改器下载

《黑神话&#xff1a;悟空》是由游戏科学公司制作的一款动作角色扮演游戏&#xff0c;于2024年8月20日正式发售。游戏改编自中国著名的神魔小说《西游记》&#xff0c;玩家在游戏中将扮演一位“天命人”&#xff0c;踏上一条充满危险与惊奇的西游之路。下面为带来这款游戏的修改…