【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.rhkb.cn/news/435302.html

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

相关文章

系统架构师-面向服务架构(SOA)全解

1、为什么需要SOA架构 1.1 系统集成问题 异构系统整合 例如&#xff0c;一个企业可能同时拥有用 Java 开发的企业资源规划&#xff08;ERP&#xff09;系统、用 C# 开发的客户关系管理&#xff08;CRM&#xff09;系统以及用 Python 开发的数据分析系统。通过 SOA&#xff0…

Transformers 中的 Softmax 可以并行加速么?

Transformers 中的 Softmax 可以并行加速么&#xff1f; 面试题 Softmax 如何并行&#xff1f; Softmax 计算公式 安全的 Softmax 运算 Softmax函数在深度学习中广泛应用于多分类问题的输出层&#xff0c;它通过指数化和归一化将一个实数向量转换为概率分布。然而&#xff…

基于springboot vue 大学生竞赛管理系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

YoloV10改进策略:BackBone改进|PoolFormer赋能YoloV10,视觉检测性能显著提升的创新尝试

摘要 在深度学习的广阔领域中,目标检测作为计算机视觉的基石任务之一,始终吸引着研究者的广泛关注。近期,我们大胆尝试将前沿的PoolFormer主干网络引入经典的目标检测框架YoloV10中,这一创新性融合不仅为YoloV10注入了新的活力,更在检测精度与效率上实现了双重飞跃,成为…

【Linux学习】【Ubuntu入门】2-1 Linux系统下运行C语言输出hello word

1.双击打开VMware软件&#xff0c;点击开启此虚拟机后&#xff0c;等待点击头像输入密码进入 2.“CtrlAltt”调出命令行终端&#xff0c;输入命令sudo apt-get install vim安装vim&#xff0c;输入命令sudo apt-get install gcc安装gcc 3.输入命令vi hello.c进入C语言编写环境&…

Web端云剪辑解决方案,提供多轨视频、音频、特效、字幕轨道可视化编辑

传统视频剪辑软件的繁琐安装、高昂硬件要求以及跨平台协作的局限性&#xff0c;让无数创意者望而却步。美摄科技作为云端视频编辑技术的领航者&#xff0c;携其革命性的Web端云剪辑解决方案&#xff0c;正重新定义视频创作的边界&#xff0c;让专业级视频剪辑触手可及&#xff…

【Linux】Docker下载与使用-nginx

目录 一、Docker介绍 二、Docker结构 三、下载Daocker 1. 在linux上下载docker&#xff0c;执行以下命令即可&#xff1a; 2. 开启docker 3. 执行以下操作并进行使用 四、在Docker上安装nginx 一、Docker介绍 Docker&#xff1a;是给予Go语言实现的开源项…

深入探讨 Docker:远程登录与镜像管理

深入探讨 Docker&#xff1a;远程登录与镜像管理 走一路&#xff0c;寻索一路。每有胡杨树&#xff0c;我必仔细浏览&#xff0c;驻足长久&#xff0c;如急于兑现一个久远的梦。而更多平常的日子如同荒原本身一样朴实无华&#xff0c;如同岁月一样不露形色&#xff0c;只守着一…

统信服务器操作系统【SSH登录常见问题】解决方案

方案适用于统信服务器操作系统D/E/A版。 文章目录 前言问题及解决方案问题一问题现象问题原因问题方案问题二问题现象问题原因问题方案问题三问题原因问题方案问题四问题现象问题原因问题方案问题五问题现象问题原因问题方案问题六问题现象问题原因问题方案前言 介绍日常使用s…

SPI驱动学习七(SPI_Slave_Mode驱动程序框架)

目录 一、SPI_Slave_Mode驱动程序框架1. Master和Slave模式差别1.1 主设备 (Master)1.2 从设备 (Slave)1.3 示例 2. SPI传输概述2.1 数据组织方式2.2 SPI控制器数据结构 3. SPI Slave Mode数据传输过程4. 如何编写程序4.1 设备树4.2 内核相关4.3 简单的示例代码4.3.1 master和s…

Jenkins本地安装配置与远程访问管理本地服务详细流程

文章目录 前言1. 安装Jenkins2. 局域网访问Jenkins3. 安装 cpolar内网穿透软件4. 配置Jenkins公网访问地址5. 公网远程访问Jenkins6. 固定公网地址 前言 本文主要介绍如何在Linux CentOS 7中安装Jenkins并结合cpolar内网穿透工具实现远程访问管理本地部署的Jenkins服务. Jenk…

活动报名| 探索存内计算的未来,共话AGI时代

活动日期&#xff1a;2024年09月28日 下午1&#xff1a;00-6&#xff1a;00 活动地点&#xff1a;杭州技术转移中心 三楼路演厅 议程亮点&#xff1a; 存内计算技术架构以及最新趋势AGI开源项目交流存内计算实操上板体验 存内计算 ——突破物理极限的下一代算力技术 直接…

kubernetes存储入门(kubernetes)

实验环境依旧是三个节点拉取镜像&#xff0c;然后在master节点拉取资源清单&#xff1a; 然后同步会话&#xff0c;导入镜像&#xff1b; 存储入门 ConfigMap volume卷--》volumemount&#xff08;挂载卷&#xff09; Glusterfs NFS ISCSI HostPath ConfigMap Secret E…

玄机--蚁剑流量

木马的连接密码是多少 黑客执行的第一个命令是什么 id 黑客读取了哪个文件的内容&#xff0c;提交文件绝对路径 /etc/passwd 黑客上传了什么文件到服务器&#xff0c;提交文件名 黑客上传的文件内容是什么 黑客下载了哪个文件&#xff0c;提交文件绝对路径 蚁剑流量特征总结 …

基于SpringBoot+Vue+MySQL的在线酷听音乐系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的飞速发展&#xff0c;网络已成为人们日常生活中不可或缺的一部分。在线音乐服务因其便捷性和丰富性&#xff0c;逐渐成为用户获取音乐内容的主要渠道。然而&#xff0c;传统的音乐播放平台往往存在歌曲资源有限…

SpringCloud 2023各依赖版本选择、核心功能与组件、创建项目(注意事项、依赖)

目录 1. 各依赖版本选择2. 核心功能与组件3. 创建项目3.1 注意事项3.2 依赖 1. 各依赖版本选择 SpringCloud: 2023.0.1SpringBoot: 3.2.4。参考Spring Cloud Train Reference Documentation选择版本 SpringCloud Alibaba: 2023.0.1.0*: 参考Spring Cloud Alibaba选择版本。同时…

C Primer Plus 第7章——第二篇

你该逆袭了 第7章:重点摘录 三、逻辑运算符1、备选拼写&#xff1a;iso646.h 头文件2、优先级3、求值顺序4、范围 四、一个统计单词的程序1、针对代码&#xff0c;提出疑问&#xff0c;第8章节进行讲解2、我结合自己的理解&#xff0c;自己写的代码 五、条件运算符 &#xff1f…

解决macOS MySQL安装后不能远程访问的问题

主要是因为我的后端服务是通过docker部署的, 无法和宿主机的MySQL进行通信. 首先输入 use mysql; 之后输入 update user set host “%” where user “root”; 最后输入 flush privileges; 合起来就是: use mysql;update user set host "%" where user &qu…

TypeScript 基本使用指南【前端 26】

TypeScript 基本使用指南 引言 TypeScript 是 JavaScript 的一个超集&#xff0c;它添加了类型系统和一些其他特性&#xff0c;使得开发大型应用时更加高效和可靠。TypeScript 代码最终会被编译成普通的 JavaScript 代码&#xff0c;这意味着你可以在任何支持 JavaScript 的环…

轻量级日志管理系统SpringBoot3+Loki+grafana的使用实例

目录 文章目录 目录1、简介2、SpringBoot3应用发送日志到Loki2.1、基本介绍2.2、添加依赖2.3、配置文件application.yml2.4、创建logback配置2.5、添加日志示例2.6、运行SpringBoot3 3、在grafana中查看日志3.1、登录grafana3.2、查询日志3.3、查询我们的SpringBoot发送过来的日…