作者主页
📚lovewold少个r博客主页
⚠️本文重点:c++入门第一个程序和基本知识讲解
😄每日一言:忙,不会死,人只有越忙越活,流水不腐,户枢不蠹。
目录
作者主页
前言
谈谈我个人对语言和职业的看法
C++的历史发展
C++第一个程序
命名空间
定义命名空间
使用此命名空间
命名空间可以嵌套
相同命名空间可以合并
编辑
输入和输出
std::cout
控制符endl
换行符
std::cin
前言
C语言的作为大多数人的入门语言,我们逐渐习惯了C语言的语法规范和一些对底层细致入微的操作。同时,无论是在线上OJ题还是一些常见问题上,C语言却没有那么好用,总是陷入重复造轮子的痛苦之中。C有C语言的优势之处,也有他的缺陷,而C++的初步诞生就是以解决C缺陷而创造的语言并演化至今,成为了当今的主流语言之一。C++语言在学习难度上也不小,在学习难度上前期的学习难度比java要难一个层次,不过问题不大,学计算机就是干。
谈谈我个人对语言和职业的看法
作为一名大学生,在职业规划的道路上,可能总会因为网络的各种繁杂信息,总是会纠结于选什么语言。互联网寒冬目前也作为一个不争的事实,有人说是因为经济的持续低迷,又有人说是因为互联网的环境影响。总而言之,外部的信息似乎并不能影响我们的选择,为何怎么说。因为外部的信息总是会将一个缺点无限放大,我们也总能听见各种“C++已死,Java已死”,又或者是“Python主流,Rust崛起,今年学Java狠狠赚一笔”的言论,让自己的学习道路总是心生焦虑。不可否定的是某些语言在一些特定业务之上就是有其独有的优势才作为主流,以就业为目的的话拥抱最新技术无可厚非,那么拥抱什么样的技术才算是新技术呢。至少在大学的学习期间,我们能接触的不能算是新技术,我们自学也触摸不到新技术的层次,现在我们的目的应该是尽可能的贴近主流职业规划道路,然后在后期的发展中尽可能发掘新风口,这可能不是单单学一门语言能解决的问题,需要有更多的硬实力。
这种硬实力最大的应该是学习能力,再其次是对社会的风向感知能力,这些能力都不是能一蹴而就的,往往还需要更多基础的能力,类似于对底层原理的掌握程度,总会给后面的拥抱新技术带来更多可能性。这也是我想选择C++的一个理由,培养我对困难问题的探索能力,去剖析编程的有趣之处。我想在我热爱这一个选择的时候我能坚定不移的去坚持下去,而不是摇摆不定的以语言问题总是打压自己学习的道路。学习是一个上瘾的事情,坚持下去就是探知,摇摆不定反而会让自己陷入不知所谓的忙碌之中。
学习C++对我而言的目的,主要是掌握一门功能强大的主流语言打下基础,为我以后能快速切换技术栈打下基础。语言不是决定性的道路,他只是一门趁手的工具,未来的诸多环境变化这个工具可能总是不太趁手,那个时候才是以硬实力,换工具只是一个熟练工具的时间问题。不去抵触新技术,新行业,新风向才可能有更高的上限吧!个人浅显理解,勿喷!
C++的历史发展
1979年,丹麦计算机科学家Bjarne Stroustrup开始研究C++的前身“C with Classes”。创造一门新语言的动机源于斯特劳斯特鲁普为他的博士论文编程的经验。Stroustrup发现Simula具有对大型软件开发非常有用的功能,但该语言对于实际使用来说太慢了,而BCPL速度很快,但级别太低,不适合大型软件开发。当Stroustrup开始在AT&T贝尔实验室工作时,他遇到了分析UNIX内核与分布式计算有关的问题。回忆起他的博士经历,Stroustrup开始用类似Simula的功能来增强C语言。选择C是因为它是通用的,快速的,便携式的和广泛使用的。除了C和Simula的影响,其他语言也影响了这种新语言,包括ALGOL 68,Ada,CLU和ML。
最初,Stroustrup的“C with Classes”为C编译器Cpre添加了功能,包括类,派生类,强类型,内联和默认参数。
1982年,Stroustrup开始开发带有类的C的后继者,在经历了其他几个名称后,他将其命名为“C++”(C中的增量运算符)。添加了新功能,包括虚函数、函数名称和运算符重载、引用、常量、类型安全的自由存储内存分配(新建/删除)、改进的类型检查以及带有两个正斜杠的 BCPL 样式单行注释 ()。此外,Stroustrup还为C++开发了一个新的独立编译器Cfront。
1984年,Stroustrup实现了第一个流输入/输出库。提供输出运算符而不是命名输出函数的想法是由Doug McIlroy提出的(他之前曾建议使用Unix管道)。
1985年,第一版《C++编程语言》发布,成为该语言的权威参考,因为当时还没有官方标准。C++的第一个商业实现于同年20月发布。
1989年,C++2.0发布,随后在1991年更新了第二版的C++编程语言。2.0中的新功能包括多重继承,抽象类,静态成员函数,常量成员函数和受保护成员。1990年,《注释C++参考手册》出版。这项工作成为未来标准的基础。后来添加的功能包括模板、异常、命名空间、新强制转换和布尔类型。
1998年,C++98发布,标准化了语言,并于03年发布了一个小更新(C++2003)。
在C++98之后,C++发展相对缓慢,直到2011年C++11标准发布,增加了许多新功能,进一步扩大了标准库,并为C++程序员提供了更多的功能。在 14 年 2014 月发布的 C++17 小更新之后,C++25 中引入了各种新增功能。[2020]在26年20月定稿后,C++2020标准草案于15年2020月27日获得批准。
Stroustrup被宣布为Charles Stark Draper工程奖的获得者,“以概念化和开发C++编程语言”。
截至2022年C++在TIOBE指数上排名第三,在该指数历史上首次超过Java。它排名第3,仅次于Python和C。
C++第一个程序
对于编程世界的大佬还是小白,接触的第一个可能就是Hello world !这里我们的编译器照样可以使用vs,简单创建一个.cpp文件。
首先C++是兼容C语言的
这个程序你依旧可以使用c语言语法。我们可以发现相比于C,它既陌生又熟悉。熟悉的地方有很多,都有主函数入口,都有返回值,感觉并无而样,但是他们包含的头文件发生了变化,而且还多了个不知所谓的"using namespace",输出也不需要printf。
命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
面对一个项目,由于分包后各个环节负责的人不同,他们的命名却可能相同,放在C语言项目中,这就是一个灾难,我们需要确定相同的命名并进行更改,那么程序员哪一位改自己的命名呢,要抉择的方式要么是比武,要么默默接受,那我改吧。
不行,程序员就是程序员,为何还要因为命名相同来一场比武,C++的命名空间即可解决这个命名冲突问题。
可以看见,在c语言中,rand在引入<stdlib.h>后函数显示重定义,既rand定义了两次,但是使用者认为我使用的rand和你库里面的rand本身就不是同一个东西,我是我的rand,你是你的rand,区分一下不可以么。
定义命名空间
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名 空间的成员。
使用此命名空间
命名空间命::变量名/函数···· 单独使用自己命名空间内部的变量
而在日常使用中,对于一个我们创建的命名空间,我们总是需要使用这种方式么。答案也是不需要的,可以一键展开命名空间,将围起的墙一键放倒,而这种方式只可以在一般日常学习中使用,或者在确保无重命名行为后展开,否则这种对于命名的封装也就失去了意义。
using namespace 命名空间命 展开此命名空间区域全部
using 命名空间名 ::变量名/函数名··· 展开命名空间特定成员
命名空间可以嵌套
一个案例即可看明白嵌套的多种情况。
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
相同命名空间可以合并
对于同一个工程文件,最后编译器会把相同命名空间进行合并。
std命名空间的使用惯例: std是C++标准库的命名空间,如何展开std使用更合理呢?
1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就 存在冲突问题。
该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。
输入和输出
在c语言的编程中,用到的最多的两个库函数无外乎就是scanf, printf。使用的过程中,我们总是需要在内部强调输入类型和输出类型。这在明确定义的操作过程中是非常繁琐的,而C++也提供了输入输出函数。
std::cout
C++的输出在方式上更加形象,且会自动识别其参数类型,而不需要使用%d,%s诸如此类的格式占位符。是显示上也更加形象,字符串和参数是流传入cout就形成I/O方式的输出操作。
在下面操作中,双括号内容是字符串,是需要打印的信息。<<这个符号表示把该语句传递给cout;该符号指出了传递信息的路径。cout是一个预定义对象,而对象是什么在后面章节会讲解。能明确的对象的一个好处就是不需要知道他的内部情况,只需要知道他的接口就可以使用它。
cout还支持多个输出传递,可以理解为从左往右依次传递流。
控制符endl
cout<<endl
endl是一个特殊的c++符号,表示一个概念:重起一行,在输出流中插入的endl将导致屏幕的光标移到下一行开头。诸如endl等对于cout有特殊含义的称之为控制符(manipulator)。和cout一样,endl也是在头文件iostream中定义的,且位于命名空间std。
换行符
/n
这一位就是老朋友了,使用和c语言方式一样,在输出内容要换行的位置加换行符号即可。
输入输出printf /scanf在c++程序中一样可以使用,因此面对与控制精度等打印操作一方面可以使用c++的内容,也可以完美的使用printf控制精度输出。
std::cin
上述的cin语句,从键盘上依次读取值然后分别赋值给a,b。从上面可以看出来,信息从cin流向了a,接着流向,b。就像c++将输出看作是输出的字符流一样,他也将输入看作是流入程序的字符流。iostream文件中将cin定义为了一个表示这种流的对象,输出时,<<运算符将字符串插入到输出流当中。输入时,cin使用>>运算符从输入流中抽取字符,通常需要在其右边提供一个变量用于接受信息。所以我们可以看见<< , > >用来选择信息流的方向。
#include<iostream>
using namespace std;
int sum(int a,int b)
{
return a + b;
}
int main()
{
int a = 0;
int b = 0;
cout << "请输入a b:" << endl;
cin >> a >> b;
int c = sum(a, b);
cout << "输出sum:" << c;
}
运行结果:
好了,目前你已经初步掌握c++的输入输出和命名空间的使用,如果你会C语言,已经可以用起来了。