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

引言

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::endlreturn 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.rhkb.cn/news/408914.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python测试框架之Pytest

初识Pytest Pytest1.Pytest的特点&#xff1a;2.Pytest的基本使用规则3.pytest安装1&#xff09;使用编译器安装2&#xff09;使用命令安装 4.pytest规则 Pytest Pytest是python的一个第三方单元测试库&#xff0c;它的目的是让单元测试变得容易&#xff0c;并且也能扩展到支持…

VSCode插件 live Server

普通打开 安装live Server 包含端口 说明内置了服务器

视频插帧—— RIFE 和 IFNet 的机制和应用

介绍 最近&#xff0c;数字和模拟技术开始加速融合。我们生活在一个人工智能技术能够显著提高质量的时代&#xff0c;只要模拟材料能够数字化。 例如&#xff0c;讨论中涉及到的纸艺软件&#xff0c;纸龙的移动模型被时间锁定&#xff0c;以大约 3 fps&#xff08;每秒帧数&a…

一元四次方程求解-【附MATLAB代码】

目录 前言 求解方法 MATLAB验证 附&#xff1a;一元四次方程的故事 前言 最近在研究机器人的干涉&#xff08;碰撞&#xff09;检测&#xff0c;遇到了一个问题&#xff0c;就是在求椭圆到原点的最短距离时&#xff0c;构建的方程是一个一元四次方程。无论是高中的初等数学…

Flink1.18 同步 MySQL 到 Doris

一、前言 使用Apache Flink实现数据同步的ETL&#xff08;抽取、转换、加载&#xff09;过程通常涉及从源系统&#xff08;如数据库、消息队列或文件&#xff09;中抽取数据&#xff0c;进行必要的转换&#xff0c;然后将数据加载到目标系统&#xff08;如另一个数据库…

【Node】【1】node和nvm安装

安装nvm、node、npm 安装node 18 &#xff0c;最简单的办法是使用nvm&#xff0c;就不用手动安装了&#xff0c;那么就得先安装nvm。 NVM 是Node Version Manager&#xff0c;用于管理 Node.js 版本。你设备上的不同项目可能使用不同版本的 Node.js。通过 nvm&#xff0c;用户…

HTTP与HTTPS:数据安全性的差异与风险分析

在现代互联网通信中&#xff0c;HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;和HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff0c;超文本传输安全协议&#xff09;是两种常见的网络协议&#xff0c;它们都在浏览器和服…

Telegram mini app 本地开发配置

前言&#xff1a; 为了能在telegram里本地调试mini app&#xff0c;参考了网上很多方案&#xff0c;踩了不少坑。最后整了一个适合自己的方案&#xff0c;记录一下。 这个方案一定不是最好的&#xff0c;不过是目前适合我上手开发的方案了。 本文章适合需要在 telegram 本地…

拼多多20家店铺登满了怎么办

解决拼多多多店铺管理难题&#xff1a;河鱼浏览器的妙用&#xff01; 在电商领域&#xff0c;拼多多已经成为许多商家的重要销售渠道。然而&#xff0c;对于同时管理多个拼多多店铺的商家来说&#xff0c;如何高效地运营这些店铺成为了一大挑战。特别是当你的店铺数量达到20家…

简化登录流程,助力应用建立用户体系

随着智能手机和移动应用的普及&#xff0c;用户需要在不同的应用中注册和登录账号&#xff0c;传统的账号注册和登录流程需要用户输入用户名和密码&#xff0c;这不仅繁琐而且容易造成用户流失。 华为账号服务&#xff08;Account Kit&#xff09;提供简单、快速、安全的登录功…

docker镜像,ip,端口映射,持久化

docker 镜像的迁移&#xff1a;导出和导入镜像 查看镜像&#xff1a; [rootdocker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 2 years ago 231MB 打包 将镜像打包&#xff0c;找到save,可以将…

【复旦微FM33 MCU 外设开发指南】外设篇1——GPIO

前言 本系列基于复旦微FM33系列单片机的DataSheet编写&#xff0c;旨在提供一些开发指南。 本文章及本系列其他文章将持续更新&#xff0c;本系列其它文章请跳转【复旦微FM33 MCU 外设开发指南】总集篇 本文章最后更新日期&#xff1a;2024/08/25 文章目录 前言GPIO工作时钟…

DevOps入门(上)

1: DevOps概念 &#xfeff;&#xfeff;DevOps: Development 和 Operations 的组合 DevOps 看作开发&#xff08;软件工程&#xff09;、技术运营和质量保障&#xff08;QA&#xff09;三者的交集。 突出重视软件开发人员和运维人员的沟通合作&#xff0c;通过自动化流程来使…

私域流量的落脚点与开源 AI 智能名片 2+1 链动商城小程序

摘要&#xff1a;本文探讨了私域流量的重要性及其落脚点&#xff0c;分析了快钱收割思维在私域流量运作中的弊端。同时&#xff0c;引入开源 AI 智能名片 21 链动商城小程序&#xff0c;阐述其在成就人格化 IP 和打造品牌域、通过直播电商规模化变现方面的作用&#xff0c;为企…

[论文笔记]Improving Retrieval Augmented Language Model with Self-Reasoning

引言 今天带来一篇百度提出的关于提升RAG准确率的论文笔记&#xff0c;Improving Retrieval Augmented Language Model with Self-Reasoning。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 检索增强语言模型(Retrie…

PostgreSQL11 | 事务处理与并发控制

PostgreSQL11 | 事务处理与并发控制 本文章代码已在pgsql11.22版本上运行且通过&#xff0c;展示页由pgAdmin8.4版本提供&#xff0c;本文章第一次采用md文档&#xff0c;效果比csdn官方富文本编辑器好用&#xff0c;以后的文章都将采用md文档 事务管理简介 事物是pgsql中的…

跨越语言障碍:2024四款实用在线翻译工具评测!

随着技术的不断进步&#xff0c;各种在线翻译工具层出不穷&#xff0c;帮助我们轻松跨越语言的鸿沟。今天&#xff0c;让我们一起探索几款非常实用的在线翻译工具&#xff01; 福昕在线翻译 直达链接&#xff1a; https://fanyi.pdf365.cn/ 福昕在线翻译是一款专注于文档翻…

LeetCode 热题 100 回顾

目录 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 2.字母异位词分组 &#xff08;中等&#xff09; 3.最长连续序列 &#xff08;中等&#xff09; 二、双指针部分 4.移动零 &#xff08;简单&#xff09; 5.盛最多水的容器 &#xff08;中等&#xff09; 6…

jmeter中导入java方法并使用

1、首先打开idea&#xff0c;在idea中点击File-New-Project ,创建一个项目&#xff0c;项目名为JmtOne 2、项目创建完成后&#xff0c;直接在main函数中定义两个方法&#xff0c;记住该主函数的包名跟类名&#xff0c;后面会用到&#xff0c;在类中定义了两种拆分字符串的方法&…

iLogtail 开源两周年:感恩遇见,畅想未来

早在上世纪 60 年代&#xff0c;早期的计算机&#xff08;例如 ENIAC 和 IBM 的大型机&#xff09;在操作过程中会输出一些基本的状态信息和错误报告&#xff0c;这些记录通常通过打印机输出到纸带或纸卡上&#xff0c;用于跟踪操作流程和调试&#xff0c;最早期的日志系统借此…