【C++篇】启航——初识C++(上篇)

下篇:【C++篇】启航——初识C++(下篇)


目录

引言

一、C++的起源和发展史

1.起源

2.C++版本更新

二、C++在⼯作领域中的应⽤

三、C++入门建议

 1.参考文档

2.推荐书籍

四、C++的第一个程序 

1.C语言写法

2.C++写法 

五、命名空间

1.为什么要有命名空间

2.定义命名空间

3.主要特点

4.使用示例

六、C++输⼊&输出 

1.概念介绍

2代码示例 

七、缺省参数

1.定义

2.代码示例

八、函数重载

1.函数重载的基本概念

2.函数重载的规则

3代码示例


引言

在编程语言的浩瀚海洋中,C++以其强大的功能和灵活性脱颖而出。自1979年由Bjarne Stroustrup在贝尔实验室开发以来,C++逐渐成为高性能应用和系统编程的首选语言。它不仅继承了C语言的高效特性,还引入了面向对象编程的概念,使得软件开发更具结构性和可维护性。

C++的广泛应用涵盖了从游戏开发、图形处理到操作系统和大型软件系统的构建。凭借丰富的标准库和强大的模板机制,C++使开发者能够编写高效且可复用的代码。这篇博客将带你深入了解C++的基本概念、发展历程,以及学习这门语言的重要性和应用场景。无论你是编程新手还是有经验的开发者,C++都能为你的编程之旅增添新的视角和技能。

一、C++的起源和发展史

1.起源

C++的起源可以追溯到1979年,由Bjarne Stroustrup在贝尔实验室开发。他在面对复杂软件开发时,意识到现有语言(如C语言)的局限性,于是于1983年在C语言基础上引入了面向对象的特性,正式命名为C++。该语言逐渐在学术界和工业界获得应用,并成为许多大学的教学语言。

2.C++版本更新

1989年,C++的标准化工作启动,1994年提出首个标准草案,其中引入了标准模板库(STL),极大丰富了C++的功能。经过多次讨论,1998年ANSI/ISO标准正式发布,奠定了C++在编程语言中的重要地位。之后,C++经历了多次更新,如C++11、C++14、C++17和C++20,持续演进以适应现代开发需求。 

 

二、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封装起来。如果你只想准备数据训练模型,那么学会Python基本上就够了,如果你想做机器学习系统的开发,那么需要学会C++。
8. 测试开发/测试。每个公司研发团队,有研发就有测试,测试主要分为测试开发和功能测试,测试开发⼀般是使⽤⼀些测试⼯具(selenium、Jmeter等),设计测试⽤例,然后写⼀些脚本进⾏⾃动化测试,性能测试等,有些还需要⾃⾏开发⼀些测试⽤具。功能测试主要是根据产品的功能,设计测试⽤例,然后⼿动的⽅式进⾏测试。

三、C++入门建议

 1.参考文档

https://zh.cppreference.com/w/cpp
https://legacy.cplusplus.com/reference/
https://en.cppreference.com/w/
说明:第⼀个链接不是C++官⽅⽂档,标准也只更新到C++11,但是以头⽂件形式呈现,内容⽐较易看好懂。后两个链接分别是C++官⽅⽂档的中⽂版和英⽂版,信息很全,更新到了最新的C++标准,但是相⽐第⼀个不那么易看;⼏个⽂档各有优势,我们结合着使⽤。

2.推荐书籍

  • C++ Primer主要讲解语法,经典的语法书籍,前后中期都可以看,前期如果⾃学看可能会有点晦涩难懂,能看懂多少看懂多少,就当预习,学了⽐特课程后,中后期作为语法字典,⾮常好⽤。
  • STL源码剖析主要从底层实现的⻆度结合STL源码,庖丁解⽜式剖析STL的实现,是侯捷⽼师的经典之作。可以很好的帮助我们学习别⼈⽤语法是如何实现出⾼效简洁的数据结构和算法代码,如何使⽤泛型封装等。让我们不再坐井观天,闭⻔造⻋,本书课程上⼀半以后,中后期可以看。
  • Effctive C++:本书也是侯捷⽼师翻译的,本书有的⼀句评价,把C++程序员分为看过此书的和没看过此书的。本书主要讲了55个如何正确⾼效使⽤C++的条款,建议中后期可以看⼀遍,⼯作1-2年后再看⼀遍,相信会有不⼀样的收获。

四、C++的第一个程序 

1.C语言写法

 C++兼容C语⾔绝⼤多数的语法,所以C语⾔实现的hello world依旧可以运⾏,C++中需要把定义⽂件代码后缀改为.cpp,vs编译器看到是.cpp就会调⽤C++编译器编译,linux下要⽤g++编译,不再是gcc

#include<stdio.h>
int main()
{printf("hello world!");return 0;
}
当然C++有⼀套⾃⼰的输⼊输出,严格说C++版本的hello world应该是这样写的。

2.C++写法 

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

五、命名空间

1.为什么要有命名空间

在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致很多冲突。 使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

2.定义命名空间

命名空间(namespace)是C++中用于组织代码的一种机制。它允许将相关的类、函数、变量等放在一个命名空间中,以避免名称冲突和提高代码的可读性。它通过关键字namespace定义,基本语法如下:

namespace NamespaceName {// 这里可以定义变量、函数、类型等int variable;void function() {// 函数实现}
}

在上面的例子中,我们定义了一个名为NamespaceName的命名空间,包含一个整数变量和一个函数。

3.主要特点

  1. 域的独立性:命名空间创建了一个独立的作用域,在这个作用域中定义的成员与全局作用域及其他命名空间的成员互不干扰。

  2. 解决命名冲突:不同的命名空间可以定义同名的变量、函数等,而不会发生冲突。例如,namespace A { void func(); } namespace B { void func(); } 可以同时存在。

  3. 可嵌套:命名空间可以嵌套定义,以更好地组织代码。例如:

    namespace Outer {namespace Inner {void innerFunction() {// 实现}}
    }
    
  4. 跨文件共享:在项目中可以在多个文件中定义同名的命名空间,它们会被视为同一个命名空间,不会冲突。

  5. 标准库的命名空间:C++标准库中的所有元素都包含在std命名空间中,例如std::coutstd::vector

4.使用示例

要使用命名空间中的成员,可以通过以下方式:

  1. 使用作用域运算符

    NamespaceName::function();
  2. 使用using声明

    using namespace NamespaceName; 
    function(); // 直接调用

    注:using展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。也可以用using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。

六、C++输⼊&输出 

1.概念介绍

<iostream> 是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输出对象。
std::cin 是 istream 类的对象 ,它主要⾯向窄字符(narrow characters (of type char))的标准输⼊流。
std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
• std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
<<是流插⼊运算符,>>是流提取运算符。 (C语⾔还⽤这两个运算符做位运算左移/右移)
使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊输出可以⾃动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是 C++的流能更好的⽀持⾃定义类型对象的输⼊输出
IO流涉及类和对象,运算符重载、继承等很多⾯向对象的知识,这些知识我们还没有讲解,所以这⾥我们只能简单认识⼀下C++ IO流的⽤法,后⾯我们会有专⻔的⼀个章节来细节IO流库。
• cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使⽤⽅式去⽤他们。
⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。
这⾥我们没有包含<stdio.h>,也可以使⽤printf和scanf,在包含<iostream>间接包含了。vs系列编译器是这样的,其他编译器可能会报错。

2代码示例 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;int main()
{
//  在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码 可以提⾼C++IO效率 ios_base::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr);int a = 10;double b = 1.1;char c = 'a';cout << a << " " << b << " " << c << endl;std::cout << a << " " << b << " " << c << std::endl;scanf_s("%d%lf", &a, &b);printf("%d %lf\n", a, b);//可以自动识别变量类型cin >> a >> b >> c;cout << a << " " << b << " " << c << endl;return 0;
}

七、缺省参数

1.定义

C++中的缺省参数(Default Parameters)是指在函数声明或定义时为参数指定的默认值。如果在函数调用时没有为这些参数提供实参,那么这些参数将自动使用默认值。这种特性可以提高函数的灵活性和易用性。以下是关于C++缺省参数的详细介绍:

缺省参数的规则:

  • 缺省参数分为全缺省和半缺省参数。
  •   全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。
  • 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
  • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值

2.代码示例

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
// 全缺省 
void Func1(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
// 半缺省 
void Func2(int a, int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}
int main()
{Func1();//等同于 func1(10, 20, 30)Func1(1);//等同于 func1(1, 20, 30)Func1(1, 2);//等同于 func1(1, 2, 30)Func1(1, 2, 3);//等同于 func1(1, 2, 3)Func2(100);//等同于 func2(100, 10, 20)Func2(100, 200);//等同于 func2(100, 200, 20)Func2(100, 200, 300);//等同于 func2(100, 200, 300)return 0;
}

八、函数重载

1.函数重载的基本概念

在C++中,函数重载(Function Overloading)是一种特性它允许我们使用相同的函数名定义多个函数,但这些函数的参数列表(参数的数量、类型或顺序)必须不同。编译器会根据传递给函数的参数来决定调用哪个函数。

函数重载的核心是参数列表的不同。下面是一些重载函数的例子:

void print(int num);
void print(double num);
void print(const char* str);

在上面的例子中,我们定义了三个名为print的函数,但它们的参数列表不同,因此它们被视为不同的函数。 

2.函数重载的规则

  • 参数数量不同:函数可以有不同的参数数量。
  • 参数类型不同:函数可以有相同数量但不同类型的参数。
  • 参数顺序不同:如果参数数量相同,参数类型也相同,但参数的顺序不同,也可以构成重载。

3代码示例

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;//1.参数类型不同
int Add(int x, int y)
{cout << "int Add(int x, int y)" << endl;return x + y;
}double Add(double x, double y)
{cout << "double Add(double x, double y)" << endl;return x + y;
}//2.参数个数不同
void fun()
{cout << "void fun()" << endl;
}void fun(int a)
{cout << "void fun(int a)" << endl;
}//3.参数类型顺序不同
void func(int a, double b)
{cout << "void func(int a, double b)" << endl;
}void func(double a, int b)
{cout << "void func(double a, int b))" << endl;
}int main()
{Add(10, 20);Add(10.1, 20.2);fun();fun(10);func(10, 2.2);func(10.1, 22);return 0;
}

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

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

相关文章

AI 对话工具汇总

&#x1f423;个人主页 可惜已不在 &#x1f424;这篇在这个专栏AI_可惜已不在的博客-CSDN博客 &#x1f425;有用的话就留下一个三连吧&#x1f63c; 目录 前言: 正文: 前言: 在科技飞速发展的时代&#xff0c;AI 对话正逐渐成为我们获取信息、交流思想的新方式。它以强…

若无向图G(V,E)中含7个顶点,为保证图G在任何情况下都是连通的,则需要的边数最少是多少?

这乍一看是不是可抽象&#xff08;迷糊&#xff09;了&#xff0c;butttt待我小翻译一下。 先举少一点的例子&#xff0c;假如我们有三个点&#xff0c;我给你两条边&#xff0c;那是不是不管咋连都一定一定是连通的。 那我们再进一步&#xff0c;假如四个点呢&#xff1f;我给…

RabbitMQ 界面管理说明

1.RabbitMQ界面访问端口和后端代码连接端口不一样 界面端口是15672 http://localhost:15672/ 后端端口是 5672 默认账户密码登录 guest 2.总览图 3.RabbitMq数据存储位置 4.队列 4.客户端消费者连接状态 5.队列运行状态 6.整体运行状态

在Linux中将设备驱动的地址映射到用户空间

本期主题&#xff1a; MMU的简单介绍&#xff0c;以及如何实现设备地址映射到用户空间 往期链接&#xff1a; Linux内核链表零长度数组的使用inline的作用嵌入式C基础——ARRAY_SIZE使用以及踩坑分析Linux下如何操作寄存器&#xff08;用户空间、内核空间方法讲解&#xff09;…

Redis篇(最佳实践)(持续更新迭代)

介绍一&#xff1a;键值设计 一、优雅的key结构 Redis 的 Key 虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过 44 字节不包含特殊字符 例如&#xff1a; 我们的登录业务&#xff0…

『功能项目』宠物的攻击巨型化【80】

本章项目成果展示 我们打开上一篇79宠物的召唤跟随的项目&#xff0c; 本章要做的事情是实现在战斗中有几率触发宠物巨型化攻击将怪物击飞的效果 首先在主角预制体中增加隐藏的宠物巨型化 制作巨型化宠物的攻击效果 将该动画控制器放置在隐藏的巨型化宠物的动画控制器上 首先查…

Linux下的基本指令/命令(一)

目录 基本命令 1. Is命令/指令: 罗列当前目录下指定的文件或者目录. 2. pwd命令&#xff1a; 查看当前工作的路径 3. cd命令&#xff1a; 切换到指定路径下。 只能切换到目录中 4. tree命令: 树状显式目录 使用前要输入命令 yum install -y tree &#xff0c;用来安装一个…

基于Hive和Hadoop的哔哩哔哩网站分析系统

本项目是一个基于大数据技术的哔哩哔哩平台分析系统&#xff0c;旨在为用户提供全面的哔哩哔哩视频数据和深入的用户行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xf…

数据流处理技术与Flink框架

一数据流 数据流定义&#xff1a; 数据流&#xff08;Data Stream&#xff09;是指数据以连续不断的方式到达和处理的序列。在现实世界中&#xff0c;许多数据来源都是以流的形式存在&#xff0c;比如&#xff1a; 1. 用户行为&#xff1a;用户在网站上的点击流、移动应用中…

【Linux】几种常见配置文件介绍

配置文件目录 linux 系统中有很多配置文件目录/etc/systemd/system、/lib/systemd/system 以及/usr/lib/systemd/system 等&#xff0c;这三者有什么样的关系呢&#xff1f; 以下是网络上找的资料汇总&#xff0c;并加了一些操作验证。方便后期使用 介绍 目录/lib/systemd/s…

使用C#,MSSQL开发的钢结构加工系统

很久以前的项目&#xff0c;上位机使用C#开发。数据库使用mssql。控制系统选用了三菱PLC&#xff0c;上位机和PLC之间走ModbusTCP通讯协议。 主要功能&#xff1a;读取加工文件&#xff08;csv格式&#xff09;&#xff0c;导入到数据库&#xff0c;并根据机床刀具规则&#x…

Python编码系列—Python命令模式:将请求封装为对象

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【软件测试】详解软件测试中的测试级别

目录 一、测试级别二、组件测试三、开发者测试3.1测试与调试3.2 组件测试目标3.3 测试功能 四、稳健性测试4.1 效率的测试4.2 测试可维护性4.3 测试策略4.4 白盒测试 一、测试级别 软件系统通常是由许多子系统组成的&#xff0c;而这些子系统又是由多个组件组成的&#xff0c;…

VMware Aria Operations for Logs 8.18 发布,新增功能概览

VMware Aria Operations for Logs 8.18 - 集中式日志管理 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-aria-operations-for-logs/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 集中式日志管理 VMware Aria …

C#测试调用FreeSpire.PDFViewer浏览PDF文件

Free Spire.PDFViewer是商业版Spire.PDFViewer的社区版本&#xff0c;支持以控件形式打开并查看PDf文件&#xff0c;但由于是免费版本&#xff0c;存在使用限制&#xff0c;打开的PDF文档只显示前10页内容。如果日常操作的pdf文件都不超过10页&#xff0c;可以考虑使用Free Spi…

Redis: Sorted Set 底层算法的简单分析

概述 我们先看下 Shorted Set 有序集合的内部数据结构所谓有序集合&#xff0c;比如有个容器&#xff0c;容器里边都已经排好序了&#xff0c;那无非就是快速的查找和插入不管你是查找还是插入&#xff0c;肯定要确定那个位置最简单的办法就是从最开头开始&#xff0c;挨个比较…

【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器

文章目录 一、Unity资源加载的几种方式1、Inspector窗口拖拽2、Resources3、AssetBundle4、Addressables&#xff08;可寻址资源系统&#xff09;5、AssetDatabase 二、准备三、同步加载Resources资源1、Resources.Load同步加载单个资源1.1、基本加载1.2、加载指定类型的资源1.…

无源码实现免登录功能

因项目要求需要对一个没有源代码的老旧系统实现免登录功能&#xff0c;系统采用前后端分离的方式部署&#xff0c;登录时前端调用后台的认证接口&#xff0c;认证接口返回token信息&#xff0c;然后将token以json的方式存储到cookie中&#xff0c;格式如下&#xff1a; 这里有…

HTTPS加密流程

本文尽量用最小的篇幅来介绍HTTPS的加密过程&#xff0c;如果还看不懂可以参考文末尾的文章。 加密算法 先简单介绍一下HTTPS中使用的是混合加密算法&#xff0c;即对称加密和非对称加密的混合使用&#xff1a; 1.对称加密:顾名思义就是加密和解密都是使用同一个密钥。 优点…

MySQL 问题小结

mysqld --initialize 初始化 data 文件夹 初始化的密码在这个 err 文件夹中