C++入门(上)

C++是一种基于C语言的面向对象编程语言,广泛应用于操作系统、服务器端、游戏、嵌入式、物联网、数字图像处理和人工智能等领域。文章强调了C++在工作和校招中的重要性,并提供了学习C++的方法和建议,包括理解命名空间、输入/输出流等概念。同时,文章列举了面试中可能出现的C++相关问题,展示了其在实际应用中的重要地位。
摘要由CSDN通过智能技术生成

目录

一、C++前言

(一)什么是C++?

(二)C++的发展史 

(三)C++的重要性 

1、使用广泛度

2、在工作领域

 1) 操作系统以及大型系统软件开发

2) 服务器端开发

3) 游戏开发

4) 嵌入式和物联网领域

5) 数字图像处理

6) 人工智能

7) 分布式应用

3、在校招领域

1) 岗位需求

2) 笔试题

3) 面试题

 (四)如何学习C++

二、C++入门 

(一) 关键词

 (二)命名空间

1、命名空间作用

2、域作用限定符

 3、展开命名空间

1)全部展开

2)指定展开

4、自动合并空间

 5、嵌套命名空间

 (三)C++输入/输出流

(四)缺省 

 1、全缺省

 2、半缺省

 (五)重载

1、概念

 2、原理


一、C++前言

(一)什么是C++?

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的
程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一
种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的, 它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的 程序设计,还可以进行面向对象的程序设计

(二)C++的发展史 

1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化,于是在C
语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with  classes。
语言的发展就像是练功打怪升级一样,也是逐步递进,由浅入深的过程。我们先来看下C++的历史版本。

   阶段                                                 内容
C with
classes
类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符重载等
C++1.0
添加虚函数概念,函数和运算符重载,引用、常量等
C++2.0
更加完善支持面向对象,新增保护成员、多重继承、对象的初始化、抽象类、静态成员以及const 成员函数
C++3.0
进一步完善,引入模板,解决多重继承产生的二义性问题和相应构造和析构的处理
C++98
C++ 标准第一个版本 ,绝大多数编译器都支持,得到了国际标准化组织 (ISO) 和美国标准化协会认可,以模板方式重写 C++ 标准库,引入了 STL( 标准模板库 )
C++03
C++ 标准第二个版本,语言特性无大改变,主要:修订错误、减少多异性
C++05
C++ 标准委员会发布了一份计数报告 (Technical Report TR1) ,正式更名C++0x,即:计划在本世纪第一个 10 年的某个时间发布
C++11
增加了许多特性,使得 C++ 更像一种新语言,比如:正则表达式、基于范围 for 循环、auto 关键字、新容器、列表初始化、标准线程库等
C++14
C++11 的扩展,主要是修复 C++11 中漏洞以及改进,比如:泛型的 lambda 表达式,auto 的返回值类型推导,二进制字面常量等
C++17
C++11 上做了一些小幅改进,增加了 19 个新特性,比如: static_assert() 的文本信息可选,Fold 表达式用于可变的模板, if switch 语句中的初始化器等
C++20
C++11 以来最大的发行版 ,引入了许多新的特性,比如: 模块 (Modules) 、协 (Coroutines) 、范围 (Ranges) 、概念 (Constraints) 等重大特性,还有对已有特性的更新:比如Lambda 支持模板、范围 for 支持初始化等
C++23                                              制定ing
C++还在不断的向后发展。但是:现在公司主流使用还是C++98和C++11,所有大家不用追求最新,重点将C++98和C++11掌握好,等工作后,随着对C++理解不断加深,有时间可以去琢磨下更新的特性。

(三)C++的重要性 

1、使用广泛度
下图数据来自TIOBE编程语言社区2021年12月最新的排行榜,在30多年的发展中,C/C++几乎一致稳居前5。

 

TIOBE 编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于互联网上有经验的程序员、 课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如 Google、MSN、Yahoo!、Wikipedia、YouTube 以及 Baidu 等)进行计算。
注意:排名不能说明那个语言好,那个不好,每门编程语言都有适应自己的应用场景
2、在工作领域
 1) 操作系统以及大型系统软件开发
所有操作系统几乎都是C/C++写的,许多大型软件背后几乎都是C++写的,比如:
Photoshop、Office、JVM(Java虚拟机)等,究其原因还是性能高,可以直接操控硬件。
2) 服务器端开发
后台开发:主要侧重于业务逻辑的处理,即对于前端请求后端给出对应的响应,现在主流采
用java,但内卷化比较严重,大厂可能会有C++后台开发,主要做一些基础组件,中间件、
缓存、分布式存储等。服务器端开发比后台开发跟广泛,包含后台开发,一般对实时性要求
比较高的,比如游戏服务器、流媒体服务器、网络通讯等都采用C++开发的。
3) 游戏开发
PC平台几乎所有的游戏都是C++写的,比如:魔兽世界、传奇、CS、跑跑卡丁车等,市面上相当多的游戏引擎都是基于C++开发的,比如:Cocos2d、虚幻4、DirectX等。三维游戏领域计算量非常庞大,底层的数学全都是矩阵变换,想要画面精美、内容丰富、游戏实时性
搞,这些高难度需求无疑只能选C++语言。比较知名厂商:腾讯、网易、完美世界、巨人网
络等。
4) 嵌入式和物联网领域
嵌入式:就是把具有计算能力的主控板嵌入到机器装置或者电子装置的内部,能够控制这些
装置。比如:智能手环、摄像头、扫地机器人、智能音响等。
谈到嵌入式开发,大家最能想到的就是单片机开发(即在8位、16位或者32位单片机产品或者
裸机上进行的开发),嵌入式开发除了单片机开发以外,还包含在soc片上、系统层面、驱动
层面以及应用、中间件层面的开发。
常见的岗位有:嵌入式开发工程师、驱动开发工程师、系统开发工程师、Linux开发工程
师、固件开发工程师等。
知名的一些厂商,比如:以华为、vivo、oppo、小米为代表的手机厂;以紫光展锐、乐鑫为
代表的芯片厂;以大疆、海康威视、大华、CVTE等具有自己终端业务厂商;以及海尔、海
信、格力等传统家电行业。
随着5G的普及,物联网(即万物互联,)也成为了一种新兴势力,比如:阿里lot、腾讯lot、京
东、百度、美团等都有硬件相关的事业部。
5) 数字图像处理
数字图像处理中涉及到大量数学矩阵方面的运算,对CPU算力要求比较高,主要的图像处理
算法库和开源库等都是C/C++写的,比如:OpenCV、OpenGL等,大名鼎鼎的Photoshop
就是C++写的
6) 人工智能
一提到人工智能,大家首先想到的就是python,认为学习人工智能就要学习python,这个
是误区,python中库比较丰富,使用python可以快速搭建神经网络、填入参数导入数据就
可以开始训练模型了。但人工智能背后深度学习算法等核心还是用C++写的。
7) 分布式应用
近年来移动互联网的兴起,各应用数据量业务量不断攀升;后端架构要不断提高性能和并发
能力才能应对大信息时代的来临。在分布式领域,好些分布式框架、文件系统、中间组件等
都是C++开发的。对分布式计算影响极大的Hadoop生态的几个重量级组件:HDFS、zookeeper、HBase等,也都是基于Google用C++实现的GFS、Chubby、BigTable。包括分
布式计算框架MapReduce也是Google先用C++实现了一套,之后才有开源的java版本。
除了上述领域外,在:科学计算、浏览器、流媒体开发、网络软件等都是C++比较适合的场景,作为一名老牌语言的常青树,C++一直霸占编程语言前5名,肯定有其存在的价值。  
3、在校招领域
1) 岗位需求

 

2) 笔试题
近两年来校招笔试主要变化:
1. 基本上都采用在线oj方式,成本低,效率高
2. 企业对代码能力要求越来越高,代码能力差的同学直接就被pass了
3. 中小厂的笔试可能还有选择题,大厂的笔试一般都是3个以上的算法题,而且普遍有一定难度
3) 面试题
1. 自我介绍
2. 你的云备份项目讲一下, 用了 哪些技术? 【项目
3. 堆栈申请空间有什么区别? 【C++
4. 不释放空间 会导致 什么?----内存泄漏 【C++】
5. 内存泄露的检测?解决办法?了解哪些内存泄露检测工具? 【C++
6. 如果说有 很多的数据,现在应该使用什么数据结构来保证对这些数据操作的效率?【数据结 构/算法
7. 讲一下红黑树 【数据结构/算法
8. 红黑树和 AVL 的区别? 红黑树 最多几次旋转可以保持平衡?【数据结构/算法
9. 你了解红黑树的旋转吗? 【数据结构/算法
10. 写代码, 字符串匹配, 不允许使用 C++,使用 C语言? 【数据结构/算法
11. 问题, 现在有大量有序数据,你能不能设计一个高效的算法,把这个有序数据随机打乱?要求:使用 rand 函数, 说了一个 复杂度 nlogn, 问还有没有更好的 想法,进行改进?
数据结构/算法
1. 自我介绍
2. 实习项目 【项目
3. C++ 面向对象特性,C++ 中多态实现机制,虚继承是如何处理二义性的问题的? 【C++
4. 智能指针 【C++
5. TCP三次握手、四次挥手,TCP 如何实现可看到传输? 【网络
6. 当三次握手第三次报文丢掉时,此时服务器端、客户端分别处于什么状态? 【网络
7. 为什么要等待2MSL?如果有大量的连接处于TIME_WAIT状态,有何影响? 【网络
8. UDP如何实现可靠传输? 【网络
9. mysql数据库存储引擎?B+树比B树好在哪里?数据库事务及特性 【数据库
10. 进程间通信方式,进程和线程的区别 【操作系统
11. 虚拟内存到物理内存如何映射的?常见的页面置换算法有哪些? 【操作系统
12. map,unorder_map区别和应用场景 【C++
13. vector、list区别? 【C++
14. 算法题:反转单链表 【数据结构/算法
15. 算法题:二叉树的最大路径和 【数据结构/算法
从校招中公司岗位的技能要求,以及学长面经总结了解到,公司在校招期间更看重学生的基础, 最主要是:语言(至少掌握一门面向对象语言java/C++)、数据结构、操作系统、网络、数据库、 设计模式等,而本门C++的授课内容,更注重学生的实践动手能力、工作中的应用以及笔试面试 中的技巧,最后达到能够正常工作以及学习即可。

 (四)如何学习C++

虽然C++语法特性繁琐复杂,经典书籍琳琅满目,但是只要你紧跟我们的节奏,你也可以“前途光明”。
多总结
1. 写博客
经常写博客不仅可以记录自己学习的历程,知识点的认识,更是复习的一把神兵利器。
2. 中后期画思维导图总结
3.常看书
4.多刷题
学习C++可分为4个层次:
第一个层次,C++基础 (平平常常)
挑选一本入门书籍,如《C++ Primer》、《C++大学教程》或Stroustrup撰写的经典
《C++程序设计语言》或他一年半前的新作《C++程序设计原理与实践》,而一般C++课程也止于此,另外《C++ 标准程序库》《The C++ Standard Library Extensions》可供参
考;
第二个层次,正确高效的使用C++ (驾轻就熟)
此层次开始必须自修,阅读过《(More)Effective C++》、《(More)Exceptional C++》、
《Effective STL》《C++编程规范》等,才适宜踏入专业C++开发之路;
第三个层次,深入解读C++ (出神入化)
关于全局问题可读《深入探索C++对象模型》、《Imperfect C++》、《C++沉思录》、
《STL源码剖析》,要挑战智商,可看关于模版及模版元编程的书籍如《C++
Templates》、《C++设计新思维》《C++模版元编程》;
第四个层次,研究C++ (返璞归真)
阅读《C++语言的设计和演化》、《编程的本质》(含STL设计背后的数学根基)、C++标准文
件《ISO/IEC 14882:2003》、C++标准委员会的提案书和报告书、关于C++的学术文献。由
于我主要是应用C++,大约只停留于第二、三个层次。然而,C++只是软件开发的一环而
已,单凭语言并不能应付业务和工程上的问题。建议读者不要强求几年内“彻底学会C++的知
识”,到达第二层左右便从工作实战中汲取经验,有兴趣才慢慢继续学习更高层次的知识
虽然学习C++有难度,但也是相当有趣且有满足感的。

 

二、C++入门 

(一) 关键词

C++总计63个关键字

 (二)命名空间

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
在C语言中,许多地方存在命名冲突的问题,在包含头文件时,作用可理解为把头文件的内容拷贝过来,当头文件库函数中变量与自己写的变量名一致是会出现重定义的问题,或者当多人合作定义变量名时,也可能会起一样的变量名,也会有重定义问题。
 

 在stdlib.h中就存在rand的变量,如果自己在新定义一个rand就会有重定义问题

为了解决这一问题,C++增加了命名空间的语法

1、命名空间作用

可以理解为把该空间的内容封起来,没有指明调用该空间里的内容时,不会调用。

这样调用时就是调用stdlib.h中的rand

2、域作用限定符

那么如何调用空间中的rand呢?

使用域作用限定符::

空间名::变量名

就是在指定域中找/使用对应的变量

 命名空间中,既可以定义变量,也可以定义函数,还可以定义结构(结构体/类)...

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
namespace syx
{
	int rand = 1;
	int Add(int x, int y)
	{
		return x + y;
	}
	struct Node
	{
		int a;
	};
}
int main()
{
	printf("%d\n", syx::rand);
	printf("%d\n",syx::Add(1, 2));
	struct syx::Node n;
	n.a = 2;
	printf("%d\n", n.a);
	return 0;
}

 

当命名空间和空间外有同一种函数/变量时,若不指定,默认使用空间外的函数/变量

 3、展开命名空间
1)全部展开

using namespace 命名空间名

将指定空间展开,以后再使用空间内变量/函数时不必再用域作用限定符,但展开后就可能会再次面临重定义问题

2)指定展开

展开时可以以指定展开,将指定的函数/变量展开,使用该函数/变量时不必使用域左右操作符 

4、自动合并空间

当定义了相同名的命名空间时,会自动合并,不会出现命名空间重定义的问题

 5、嵌套命名空间

命名空间中还可以写命名空间,不过访问也需要多写一层

 (三)C++输入/输出流

cout是打印,需要引用C++头文件<iostream>,并且需要在命名空间std中,需要使用域作用限定符::

 频繁使用std::太过麻烦,可以用展开命名空间简化代码,而且展开std一般不是很危险

cin是输入,和cout一样需要引用C++头文件<iostream>

输入是>>,输出是<<,二者方向是相反的!

 

注意: 

1. 使用cout标准输出对象(控制台)cin标准输入对象(键盘)时,必须 包含< iostream >头文件(没有“.h”!!!)
以及按命名空间使用方法使用std。
2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
iostream >头文件中。
3. <<是流插入运算符,>>是流提取运算符
4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
C++的输入输出可以自动识别变量类型。
5. 实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识。

(四)缺省 

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。

 1、全缺省

传参只能从左到右赋值

不能只给后面的值传参不给前面的值传参

 2、半缺省

 半缺省的值只能从右往左不能只给左边而不给右边

 (五)重载

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
1、概念
函数重载条件:1、在同一作用域
                       2、函数名相同
                       3、参数数亮不用/参数类型不同/参数类型顺序不同
相同的函数名不同的传参输出的结果不同

 这种情况不在同一作用域上,所以这不是重载

 

 2、原理
C/C++ 中,一个程序要运行起来,需要经历以下几个阶段: 预处理、编译、汇编、链接

 

//a.cpp
int main()
{
    Add(1,2);
    return 0;
}
//b.cpp
int Add(int a,int b)
{
    return a + b;
}
1. 实际项目通常是由多个头文件和多个源文件构成,而通过 C 语言阶段学习的编译链接,我们可以知道,【当前a.cpp 中调用了 b.cpp 中定义的 Add 函数时】,编译后链接前, a.o 的目标
文件中没有 Add 的函数地址,因为 Add 是在 b.cpp 中定义的,所以 Add 的地址在 b.o 中。那么
怎么办呢?
2. 所以链接阶段就是专门处理这种问题, 链接器看到 a.o 调用 Add ,但是没有 Add 的地址,就
会到 b.o 的符号表中找 Add 的地址,然后链接到一起。
3. 那么链接时,面对 Add 函数,链接接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则。
4. 通过下面我们可以看出 gcc 的函数修饰后名字不变。而g++的函数修饰后变成【 _Z+ 函数长度 + 函数名 + 类型首字母】。
gcc↑

 g++↑

结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参

数类型信息添加到修改后的名字中。
如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办
法区分。

所以C语音无法构成重载,C++可以构成重载

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值