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

news2024/11/19 17:30:35

目录

引言

一、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.coloradmin.cn/o/2178101.html

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

相关文章

C程序设计——结构化程序设计的三种结构

前面我说过&#xff1a;“结构化编程语言&#xff0c;用语法限制程序员&#xff0c;只能使用顺序、选择、循环三种结构来解决问题。” 接下来&#xff0c;就讲解这三种结构。 顺序结构 前面我讲过&#xff0c;C语言所有的程序&#xff0c;都必须有一个 main 函数&#xff0c…

TCP\IP标准与OSI标准

TCP/IP 模型和 OSI 模型都是用于描述网络体系结构的模型&#xff0c;但它们的设计理念和层次结构有所不同。TCP/IP 模型更注重实际实现&#xff0c;而 OSI 模型更注重抽象和标准化。 1. OSI 模型 (Open Systems Interconnection Model) OSI 模型是一个七层模型&#xff0c;从…

828华为云征文|部署在线论坛网站 Flarum

828华为云征文&#xff5c;部署在线论坛网站 Flarum 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 Flarum3.1 Flarum 介绍3.2 Flarum 部署3.3 Flarum 使用 四、总结 一、…

针对考研的C语言学习(定制化快速掌握重点2)

1.C语言中字符与字符串的比较方法 在C语言中&#xff0c;单字符可以用进行比较也可以用 > , < ,但是字符串却不能用直接比较&#xff0c;需要用strcmp函数。 strcmp 函数的原型定义在 <string.h> 头文件中&#xff0c;其定义如下&#xff1a; int strcmp(const …

Vue.js组件开发指南

Vue.js组件开发指南 Vue.js 是一个渐进式的 JavaScript 框架&#xff0c;用于构建用户界面。它的核心是基于组件的开发模式。通过将页面分解为多个独立的、可复用的组件&#xff0c;开发者能够更轻松地构建复杂的应用。本文将深入探讨 Vue.js 组件开发的基础知识&#xff0c;并…

基于springoot新能源充电系统的设计与实现

新能源充电系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统新能源充电系统信息管理难度…

国产纯电SUV都在秀,只有Model Y在挨揍

文/王俣祺 导语&#xff1a;如果想知道纯电SUV应该怎么选&#xff0c;一定有人告诉你“无脑选Model Y”&#xff0c;虽说特斯拉确实粉丝多&#xff0c;但这也恰恰证明Model Y一度成为了纯电SUV的标杆。有标杆自然就有挑战者&#xff0c;随着阿维塔07、智己LS6以及乐道L60先后上…

云南省职业院校技能大赛赛项规程(软件测试)

赛项名称&#xff1a;软件测试 英文名称&#xff1a;Software Testing 赛项组别&#xff1a;高等职业教育 赛项编号&#xff1a;GZ034 目录 一、 赛项信息 二、竞赛目标 三、竞赛内容 1、本赛项考查的技术技能和涵盖的职业典型工作任务 2、专业核心能力与职业综合能力…

商标名称注册查询,到底是查询什么!

在商标注册前是需要商标名称注册查询&#xff0c;那这个到底是查询什么&#xff0c;普推知产商标老杨发现&#xff0c;近日国家知产局发布《商标代理委托合同示范文本》征求意见稿&#xff0c;虽然是参考使用不具有强制性&#xff0c;里面对商标名称注册查询描述是申请前商标检…

完成UI界面的绘制

绘制UI 接上文&#xff0c;在Order90Canvas下创建Image子物体&#xff0c;图片资源ui_fish_lv1&#xff0c;设置锚点&#xff08;CountdownPanelImg同理&#xff09;&#xff0c;命名为LvPanelImg,创建Text子物体&#xff0c;边框宽高各50&#xff0c; &#xff0c;重名为LvT…

阻焊层解析:PCB的“保护伞”是什么?

在电子制造行业中&#xff0c;尤其是PCBA贴片加工领域&#xff0c;阻焊层是一个重要的概念。以下是对阻焊层的详细讨论分析&#xff0c;包括其定义、作用以及类型。 阻焊层的定义 阻焊层&#xff0c;顾名思义&#xff0c;是一种用于阻止焊接的材料层。在PCB&#xff08;印刷电…

11.C++程序中的常用函数

我们将程序中反复执行的代码封装到一个代码块中&#xff0c;这个代码块就被称为函数&#xff0c;它类似于数学中的函数&#xff0c;在C程序中&#xff0c;有许多由编译器定义好的函数&#xff0c;供大家使用。下面就简单说一下&#xff0c;C中常用的函数。 1.sizeof sizeof函…

Perceptually Optimized Deep High-Dynamic-RangeImage Tone Mapping

Abstract 我们描述了一种深度高动态范围&#xff08;HDR&#xff09;图像色调映射算子&#xff0c;该算子计算效率高且感知优化。 我们首先将 HDR 图像分解为归一化拉普拉斯金字塔&#xff0c;并使用两个深度神经网络 (DNN) 根据归一化表示估计所需色调映射图像的拉普拉斯金字…

Mybatis缓存机制(图文并茂!)

目录 一级缓存 需求我们在一个测试中通过ID两次查询Monster表中的信息。 二级缓存 案例分许(和上述一样的需求) EhCache第三方缓存 在了解缓存机制之前&#xff0c;我们要先了解什么是缓存&#xff1a; ‌缓存是一种高速存储器&#xff0c;用于暂时存储访问频繁的数据&…

利用大模型改进知识图谱补全的研究

人工智能咨询培训老师叶梓 转载标明出处 尽管现有的基于描述的KGC方法已经利用预训练语言模型来学习实体和关系的文本表示&#xff0c;并取得了一定的成果&#xff0c;但这些方法的性能仍然受限于文本数据的质量和结构的不完整性。 为了克服这些限制&#xff0c;中国科学技术…

PG高可靠模拟

模拟延迟 主库故障&#xff0c;备库尝试切换为主库

9.29 LeetCode 3304、3300、3301

思路&#xff1a; ⭐进行无限次操作&#xff0c;但是 k 的取值小于 500 &#xff0c;所以当 word 的长度大于 500 时就可以停止操作进行取值了 如果字符为 ‘z’ &#xff0c;单独处理使其变为 ‘a’ 得到得到操作后的新字符串&#xff0c;和原字符串拼接 class Solution { …

MySQL - 运维篇

一、日志 1. 错误日志 2. 二进制日志 3. 查询日志 记录了所有的增删改查语句以及DDL语句 4. 慢查询日志 二、主从复制 1. 概述 2. 原理 3. 搭建 三、分库分表 1. 介绍 2. Mycat概述 3. Mycat入门 4. Mycat配置 5. Mycat分片 6. Mycat管理及监控 四、读写分离 1. 介绍 2. 一…

【ADC】使用运算放大器驱动 SAR 型 ADC 时的线性输入范围

概述 本文学习于TI 高精度实验室课程&#xff0c;总结使用运算放大器驱动 SAR ADC 时的注意事项。具体包括&#xff1a;了解运算放大器共模范围和输出摆幅限制如何影响 SAR ADC 性能&#xff0c;研究运算放大器设计技术以避免共模和输出摆幅限制&#xff0c;讨论轨到轨放大器与…

PCB敷铜敷不了相同网络的线怎么办?

图片上的情况就是今天需要讲的内容&#xff0c;可以看出出来的线头是GND,敷的铜也是GND但是相同网络就是不能连在一起。 解释&#xff1a; 这是因为我们敷铜的时候属性选的是连接相同的net,如图所示&#xff1a; 解决办法&#xff1a; 只需要设置改为相同的Object就可以了&…