初识C++入门(1)

为什么会衍生出C++?

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了00P(object oriented programming: 面向对象)思想,支持面向对象的程序设计语言应运而生。


1982年,Biarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了-种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此: C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计(这也是C++兼容C语言的原因),又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

C++祖师爷的介绍

本贾尼·斯特劳斯特卢普(Bjarne Stroustrup,1950年6月11日-),丹麦人,计算机科学家,在德克萨斯A&M大学担任计算机科学的主席教授。他最著名的贡献就是开发了C++程序设计语言。

1982年,美国AT&T公司贝尔实验室的本贾尼博士在C语言的基础上引入并扩充了面向对象的概念,发明了—种新的程序语言。为了表达该语言与C语言的渊源关系,它被命名为C++。而本贾尼博士被尊称为C++语言之父。

1979 年,贝尔实验室的本贾尼等人试图分析 unix 内核的时候,试图将内核模块化,于是 C
语言的基础上进行扩展,增加了类的机制 ,完成了一个可以运行的预处理程序,称之为 C with
classes 。C++也是在不断更新的(完善和添加新语法等等)
C++还在不断发展, 但现在公司主流使用的还是C++98和C++11,目前重点掌握这两个即可,其他的版本语法可以等待工作以后随着对C++理解不断加深,再去了解其他版本语法特性。
C++的重要性
下图数据来自TIOBE编程语言社区202112月最新的排行榜,  在30多年的发展中,C/C++几乎一
致稳居前5。  
在工作领域中C++的作用
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名,肯定有其存在的价值。
C++的介绍就到这里吧!你还记得学习C语言第一节课在电脑屏幕上输出hello world的喜悦感吗?
接下来我们以C++的形式输出hello world!
#include<iostream>
using namespace std;

int main()
{
	cout << "hello world" << endl;

	return 0;
}

我们先不用看懂全部代码 比如using namespace std;cout <<endl是什么意思?

咱们不急,先听我娓娓道来,我会在下面解释到的,解开困惑的

第一个知识 命名空间 namespace

当我们用C语言运行这段代码会出现报错

#include<stdio.h>
#include<stdlib.h>
int rand = 10;

int main()
{

	printf("%d ", rand);
	return 0;
}

为什么呢?因为在头文件<stdlib.h>库里面就包含了rand函数,我们再次使用rand定义了全局变量,因此会出现命名冲突,但C语言无法解决这种命名冲突问题,所以C++祖师爷为了解决命名冲突问题提出了namespace来解决。

命名空间一般用namespace+自己定义名字

比如我使用的是namespace as (as就是命名空间的名字)

用%p访问rand是因为rand是头文件里面的rand函数 编译器会推荐用%p访问

#include<stdio.h>
#include<stdlib.h>

namespace as
{
	int rand = 10;
}
int main()
{

	printf("%p", rand);
	return 0;
}

那怎么访问命名空间里面的rand的值呢?

使用 : :域作用限定符来访问

#include<stdio.h>
#include<stdlib.h>

namespace as
{
	int rand = 10;
}
int main()
{

	printf("%p", rand);
	printf("%d", as::rand);
	return 0;
}

命名空间相当于用围墙把rand"保护了起来"且留了一个入口,入口上面有牌匾"里面有恶犬 生人勿近 会咬人",只能有熟人进去喂"它(rand)"食物和与它互动。

#include<stdio.h>
#include<stdlib.h>

namespace as
{
	int rand = 10;

	struct Node
	{
		struct Node* next;
		int val;
	};

	int Add(int left, int right)
	{
		return left + right;
	}
}
int main()
{

	printf("%p\n", rand);
	printf("%d\n", as::rand);
	printf("%d\n", as::Add(2, 3));
	struct as::Node node;
	return 0;
}

假设同一个命名空间有相同的变量会怎么样呢?会不会自己和自己打一架?

实际上命名空间是可以嵌套的

#include<stdio.h>
#include<stdlib.h>

namespace as
{
	int rand = 10;
	namespace as1
	{
		int rand = 30;
	}
	namespace as2
	{
		int rand = 20;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};

	int Add(int left, int right)
	{
		return left + right;
	}
}
int main()
{

	printf("%p\n", rand);
	printf("%d\n", as::rand);
	printf("%d\n", as::as1::rand);
	printf("%d\n", as::as2::rand);

	printf("%d\n", as::Add(2, 3));

	struct as::Node node;

	return 0;
}

比如你在公司需要写项目比如栈,为了防止与同事写的冲突就可以运用命名空间

Stack.h
#pragma once
#include<stdio.h>
#include<stdlib.h>

namespace fk
{
	typedef struct Stack
	{
		int* a;
		int sz;
		int capacity;
	}ST;
	void STInit(ST* ps);
	void STPush(ST* ps,int x);
}


test.cpp
#include"Stack.h"

namespace fk
{
	void STInit(ST* ps)
	{
		ps->a = NULL;
		ps->capacity = ps->sz = 0;
	}
	void STPush(ST* ps, int x)
	{
		//....
	}
}


int main()
{
	fk::ST st;
	fk::STInit(&st);
	fk::STPush(&st, 1);
	fk::STPush(&st, 2);
	fk::STPush(&st, 3);
}

那么它们运行起来不会冲突吗?

  同一个工程中允许存在多个相同名称的命名空间 , 编译器最后会合成同一个命名空间中。
一个工程中的 test.h 和上面 test.cpp 中两个fk 会被合并成一个。
当我们每次访问栈的时候都要使用命名空间名称+域作用限定符是不是有点太麻烦了?
有没有什么方法能直接访问呢?
这个时候就有了 usingnamesapce+命名空间名称 上面我们用C++输出hello world时候运用到了这个


test.cpp
#include"Stack.h"

namespace fk
{
	void STInit(ST* ps)
	{
		ps->a = NULL;
		ps->capacity = ps->sz = 0;
	}
	void STPush(ST* ps, int x)
	{
		//....
	}
}

using namespace fk;
int main()
{
	ST st;
	STInit(&st);
	STPush(&st, 1);
	STPush(&st, 2);
	STPush(&st, 3);
}

只需要在test.cpp写上一句 using namespace fk;即可

那么using namespace std;是什么意思呢?

std是C++官网标准库的命名空间,当我们展开std时,库里面的函数就可以使用了

那么std库里面的函数能随意展开吗?答案是否定的

在我们平常练习C++时可以展开自己定义的命名空间和std库的命名空间,但在实际工程上是不能随意展开的,容易出现冲突。

#include<iostream>是C++的头文件 类似于C语言的#include<stdio.h>

i=In O=Out 输入与输出 <<是流插入

C++为了有自己的换行符有了endl  endl=end line.

#include<iostream>

int main()
{
	//<< 是流插入
	int a = 10;
	std::cout << a << "\n";

	int b = 20;
	double e = 13.14;
	// << 可以自动识别数据类型
	int c = 545;
	std::cout << b<< "\n";
	std::cout << e << "\n";

	std::cout << c << std::endl;

	return 0;
}

 

在我们不展开C++的库函数时,只能用域作用限定符来cout和endl,例如std::cout std::endl

但每次指定命名空间不方便,又害怕C++库里面函数全部暴露 又有风险冲突?

那么怎么办呢?我们可以指定展开命名空间 例如下图

#include<iostream>
using std::cout;
using std::endl;
int main()
{
	//<< 是流插入
	int a = 10;
	cout << a << "\n";

	int b = 20;
	double e = 13.14;
	// << 可以自动识别数据类型
	int c = 545;
	cout << b<< "\n";
	cout << e << "\n";

	cout << c << endl;

	return 0;
}

 

 

cout中的C=console(控制台) cin是流提取 相当于C语言的scanf

#include<iostream>
using std::cout;
using std::endl;
int main()
{
	int a = 20;
	int b = 30;

	cout << a << endl << b << endl;

	std::cin >> a >> b;

	return 0;
}

 

如果要控制数字精度怎么办呢?使用C,因为C++兼容C

#include<iostream>
using std::cout;
using std::endl;
int main()
{
	int a = 20;
	int b = 30;
	double c = 13.1424;
	cout << a << endl << b << endl;
	//控制精度用C 因为C++兼容C
	printf("%.1lf\n", c);

	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值