C++新手教程

第一章 绪论

C++是当今流行的编程语言,是在C语言基础上发展起来的,随着面向对象编程思想的发展,C++也融入了新的编程理念,这些理念有利于程序的开发。C++从语言角度来说也是一个规范,对着规范的发布,许多C++编译器不断涌现,不同的C++编译器也带来不同的语言特性,这给程序员来带了广阔的选择空间。

1.1 C++历史背景

要学一门语言,首先要对这门语言有一定的了解,知道这门语言能做什么,要怎样才能学好。本文(C++小盆友写的)将带大家走进C++的学习之门!第一节将对C++语言的历史背景进行简单的介绍,让你对C++语言有一个简单而直接的印象。

1.1.1 计算机——20世纪最伟大的发明

计算机的出现给人们的生活带来了巨大的彼岸花,它是如何发展起来的呢?开始时人们致力研究的能够进行四则运算的机器,是通过机械齿轮驱动的加法器,而后是精度只有12位的乘法计算器,直到1847年Charles Babbages开发出能计算31位精度的机械式差分机,普遍认为这台差分机是世界上第一台机械式计算机。随着电子技术的发展,真空二极管、真空三极管问世,到1939年第一部用真空管计算的机器被研制出来,该机器能进行16位加法运算;随后,用氖气灯(霓虹灯)的储存器、复杂数字计算机(断电器计数机)、可编写程序的计数机,意义研制出来,1946年,第一台电子管计算机ENIAC在美国研制出来,这台计算机占地170m²,质量30t,有1.8万个电子管,用十进制计算,运算5000次/s。计算机从此进入了电子计算机时代,经历了真空管计算机、晶体管计算机、集成电路计算机、大规模集成电路计算机4个阶段,每一个阶段都是随着电子技术的发展而发展的,晶体管的出现取代了电子管,将电子元件集成到一片小小的硅片上,形成集成电路(IC),在一块芯片上容纳几百个或是几千个电子元件形成了大规模集成电路(LSI),直到现在已经出现了很薄的电子芯片,可谓发展迅速。

现在的计算机已经应用到各个领域,科学计算、信号检测、数据管理、辅助设计都在使用计算机,人们的生活已经渐渐离不开它,所以说计算机时20世纪最伟大的发明。

1.1.2 C++发展历程

早期的计算机程序语言时计算机控制指令,每条指令时一组二进制数,不同的计算机有不同的计算机指令集。使用二进制指令集开发程序是一件很令人头痛的事,需要记住大量的二进制数。为了便于记忆,人们将二进制数用字母组合代替,以字符串关键字代替二进制机器码的编程语言称为汇编语言。汇编语言被称为低级语言,虽然它比机器码容易记忆,但仍然具有可读性差的缺点,大量的跳转指令和地址值很难让程序员在很短的时间理解程序的意思,于是编程语言进入了高级语言时代。

第一种高级语言是美国尤尼法克公司在1952年研制成功的Short Code,被广泛使用的高级语言是FORTRAN,它是由美国科学家John Backus设计并在IBM公司的计算机上实现的。FORTRAN语言和ALGOL60主要应用于科学和工程计算,随后出现了Pascal和C语言。C语言是在其它语言基础上发展起来的。首先是由Richar Martin开发了一种高级语言BCPL,随后Ken Thompson使用BCPL语言对其进行了简化,形成一门新的语言——B语言,B语言没有类型的概念,Dennis M. Ritchie对B语言进行研究和改进,在B语言基础上添加了结构和类型,并将这个改进后的语言命名为C语言,于一很简单,因为字母C是字母B的下一个字母,预示着语言的发展。

本文(C++小盆友写的)介绍的C++语言就是从C语言发展而来的。Bjarne Stroustrup金国钻研在C语言中加入了类的概念,C++最初的名字是C with Class,到1983年12月由Rick Mascitti建议改名为C Plus Plus,即C++。最开始提出类概念的语言是Simula,它具有很高的灵活性,但无法胜任比较大型的程序。此后在Simula语言基础上发展的语言Smalltalk才是真正的变相对象语言,但Smalltakl-80不支持多继承。

C++从Simula继承了类的概念,从ALGOL68继承了运算符重载、引用以及在任何地方声明变量的能力,从BCPL获得了“//”注释,从Ada得到了模板、名字空间,从Ada、Clu和ML取来了异常。

1.1.3 C++领域杰出人物

此部分作者正在详细学习中……

1.2 常用开发环境

在使用C++语言开发程序前,需要先选择一款开发环境。下面就对一些常用的C++语言开发环境进行简单的介绍。

1.2.1 Visual C++ 6.0

Visual C++ 6.0 是由微软公司开发的C++开发环境,它是Visual Studio集成开发环境中的一员。Visual C++ 6.0可以创建Windows应用程序、DLL动态链接库、COM组件以及ActiveX控件等。但现在Visual C++ 6.0已经停止更新,不推荐使用。Visual C++开发环境如下:

1.2.2 Visual Studio 2019(2022)

Visual Studio 2019是目前比较流行的开发环境,它更加支持C++标准规范,而且支持托管程序的编译和Web Service。应该说Visual Studio 2019非常强大,无论是功能上还是编译速率上都有很大提高。Visual Studio 开发环境如下:

1.2.3 GCC/G++

Linux系统中一般都带有C/C++的编译器,能够编译C代码的是GCC,能够编译C++代码的是G++。

如果是在没有GDK或GDE等界面系统的Linux系统下,编写代码需要使用VI文本命令,它和DOS下的TYPE命令很像,由于没有鼠标,只能顺序地编写代码,使用它编写代码对于程序员来说相当麻烦。但在有界面地Linux系统下,系统都会提供可视化地文本编辑器,其中比较有名的是emacs,因为emacs集成了编译代码地菜单,通过emacs可以直接编写代码并编辑,并且可以直接执行编译后地程序。

1.2.4 Dev-C++

Dev-C++是将Linux系统地GCC/G++运用到Windows系统后地产物,编译代码地程序是GCC.exe和G++.exe,这两个程序源于开源项目mingw,Dec-C++是能够调用GCC.exe和G++.exe来编译程序地代码编辑器。Dev-C++开发环境如下:

1.2.5 Eclipse

 Eclipse是IBM开发的、早期用来编写Java代码地编译器。由于CDT插件地出现,使Eclipse也可以用来编写C/C++代码。同Dev-C++一样,Eclipse也使用开源项目下的GCC.exe和G++.exe来编译代码,所以在使用Eclipse前一定要注意设置好相关路径。

1.3 认识C++程序代码

C++程序代码是由预编译指令、宏定义、注释、主函数、自定义函数等很多部分组成的,这些部分都是后文讲述的主要内容。下面是一段很短但涉及C++语言概念比较多的代码:

如上图所示的代码中还有头文件引用、函数作用空间、库函数调用、赋值运算、关系判断、流输出等很多C++语言方面的概念,各概念之间通过一定规则排列在一起,编译器根据这些规则将代码编译成能够在机器上执行的应用程序。

1.4 使用 Dev-C++ 创建程序

很简单,打开Dev-C++的初始界面,按键盘上的Ctrl键和N键,就创建了一个全新的程序,保存按Ctrl+S

1.5 使用 Visual Studio 创建程序

打开Visual Studio界面,点击创建新项目,搜索空项目,点击空项目,给项目改名,进入IDE界面后按Ctrl+Shift+A创建新cpp文件

然后就好啦!

1.6 编译与连接过程

开发应用程序可以分为编辑、编译、连接、执行4个步骤。

1.编辑

编辑是在文本编辑器中输入代码,并对代码字符进行增、删、改,然后将输入的内容保存成文件。输入Hello World程序代码,并将代码保存成Samlple.cpp文件。

2.编译

编译时将代码文件编译成目标文件。编译过程就是将Sample.cpp编译成Sample.obj。

3.连接

连接时将编译后的目标文件连接成可执行的应用程序。如将Sample.obj和lib库文件连接成Sample.exe可执行程序。lib库时编译好的提供给用户使用的目标模块,在有多个源文件的工程中,例如Sample1.cpp、Sample2.cpp、Sample3.cpp,会编译成多个目标模块Sample1.obj、Sample2.obj、Sample3.obj,链接器会将程序涉及的目标模块连接成可执行程序。

4.执行

执行生成的应用程序。

1.7 C++的特点

1.C++语言中,运算符十分丰富,共有30多个,如算数、关系、逻辑、位、赋值、指针、条件、逗号、下标、类型转换等。

2.C++语言的数据类型包括整型、实型、字符型、枚举类型等基本类型,数组、结构体、共用体等构造类型,指针类型,以及用户自定义数据类型。能够实现复杂的数据结构,还可以定义类实现面向对象编程,类和指针结合可以实现高效的程序。

3.C++语言的控制语句形式多样,使用方便。包括两路分支、多路分支、循环结构等控制语句,便于结构化模块的实现。结合面向对象编程,更有利于程序的编制和维护。

4.C++时一种面向对象的程序设计语言,抽象和实际相结合,各对象间使用消息进行通信,通过继承方法增加了代码的复用。

5.C++语言继承了C语言的特性,可以直接访问地址,进行位运算,从而对硬件进行操作。C++语句具有编写简单、便于理解,以及低级语言与硬件结合紧密的有点。

6.C++语句具有很强的可移植性,用C++语言编写的程序基本不用修改太多就可以用于不同型号的计算机上,C++标准可在多种操作系统下使用。

1.8 小结

任何编程语言都有它的时代性,都是不断发展的,C++现在是一个成熟的语言,首先要理解C++语言新的编程理念,然后选择自己喜欢的开发环境。例如,可以选择微软的Visual Studio、Dev-C++等。

第二章 数据类型

2.1 第一个C++程序

下面是一个简单的输出Hello World!的C++程序。

#include<iostream>
using namespace std;
void main(){
    cout<<"Hello World!\n";
}

在这个简单的C++程序中,包括头文件、命名空间、主函数、字符串常量、数据流等,这些都是C++程序中经常用到的。下面我们开始对C++常用的概念进行介绍

2.1.1 #include指令

C++程序中带“#”号的语句称为宏定义或预编译指令。关于什么是宏定义或预编译指令,作者(我)会在后面章节讲解。这里,你只需要清楚:#include在代码中是包含和引用的意思,上面第一行代码#include<iostream>说明代码要引用iostream文件内容,编译器在编译程序时讲iostream种的内容在#include<iostream>处展开。

2.1.2 注释

注释是对前面或下面语句的解释说明,编译器不会对注释部分进行编译。C++程序种有两种注释方法,其中“//”是单行注释,从注释符号“//”开始,到本行代码结束位置的内容为注释部分;“/*   */”是多行注释,符号“/*”放在将要注释代码的前面,符号“*/”放在将要注释代码的末尾,符号“/*”和“*/”中间的内容为注释部分。另外,多行注释种不允许嵌套另一个多行注释,如/*/**/*/,做后出现的符号“*/”将无效。在我们第一个C++程序种加入注释,代码如下:

/*sample.cpp*/
#include<iostream>                  //头文件引用
using namespace std;                //命名空间
void main(){                        //主函数
    cout<<"Hello World!\n";         //执行输出
    //cout<<"end";
}

2.1.3 main函数

main的意思是“主要的”,main函数即主函数,它是程序执行的入口。程序将从main函数的第一条指令开始执行,知道main函数结束,整个程序也将执行结束。注意函数的书写格式,单词main后面有个小括号“()”,里面放置参数。main函数相关的内容将在后面章节讲解。

2.1.4 函数体

大括号“{}”中的内容是需要执行的,称为函数体。函数体中,各行代码将按照先后顺序依次执行,写在前面的先执行,写在后面的后执行。代码“cout<<"Hello World!\n";”表示通过输出流输出英文语句Hello World!,其中双引号" "代表该英文语句是字符串常量,cout表示输出流,<<表示将字符串传送到输出流中。

2.1.5 函数返回值

void表示main函数无返回值,如果要返回数据,需要使用return语句

2.2 常量及符号

在程序运行过程中,其值不能改变的量成为常量。常量可分为整型常量、实型常量、字符常量、字符串常量和其他常量。

#include<iostream>
using namespace std;
void main(){
    cout<<2009<<endl;
    cout<<2.14<<endl;
    cout<<'a'<<endl;
    cout<<"Hello World"<<endl;
}

 上面代码荣国cout向屏幕输出4行内容。cout是输出流,实现向屏幕输出不同类型的数据。代码中2009是整型常量,2.14是浮点常量(实型常量),'a'是字符常量,"Hello World"是字符串常量。

2.2.1 整型常量

整型常量可以分为有符号整型常量和无符号整型常量。

-225代表一个负整数,+1024代表一个正整数,正整数前面的“+”符号可以省略,即+1024和1024表示的意义相同。

基本的数据类型除了整型外,还有长整型和短整型,因此整型常量也有长整型常量和短整型常量之分。长整型常量不可以无限大,它的最大值是有限定的。根据CPU寄存器位数以及编译器的不同,最大的整型常量值也会不同。

整型常量在编写代码时不仅可以写成十进制整数形式,也可以写成十六进制或八进制整数形式。

(1)八进制整型常量必须以0开头,即以0作为八进制数的前缀,每位取值范围是0~7.八进制数通常是无符号数。

例如,016、0101、0127是合法的八进制整数;256、0396不是合法的八进制整数。因为,256无前缀0,代表十进制整型常量;0396中数字9不是八进制应有的取值。

(2)十六进制整型常量的前缀位0X或0x,其数码取值范围位0~9,以及A~F或a~f。

例如,0X2A1、0XC5、0XFFFF是合法的十六进制整数;5A、0X3N不是合法的十六进制整数。因为5A无前缀0X,0X3N中含有非十六进制数N。

2.2.2 实型常量

实型常量也称为浮点数,只能采用十进制形式表示。它有两种表示形式,即小数表示法和指数表示法。

1.小数表示法

小数表示法由整数部分和小数部分组成,两部分每位取值范围都是0~9,中间用小数点分隔。例如,0.0、2.25、0.00596、5.0、536.、-5.3、-0.002等均为合法的实型常量。

整数部分和小数部分有时可以不必同时出现,例如2.。

2.指数表示法

指数表示法也称为科学计数法,指数部分以符号“e”或“E”开始,但必须是整数,并且符号“e”或“E”两边都必须有一个数。例如,1.2e20和-2.4e-2。其中,1.2e20表示的数位1.2×10²⁰。

E5、3E2.5不是合法的实型常量,E5是E之前无数字,3E2.5是E后面有小数。

说明:在字母e之前的小数部分中,小数点左边应有一位(且只能有一位)非零的数字,称为规范化的指数形式。

L代表长整型。L可以是大写也可以是小写,在编写代码时可以不写。此类符号还有U和u代表无符号。例如,255U或255u都代表无符号整型常量255.

符号L或l与符号U或u可以一起使用。例如,65536lu代表无符号长整型常量65536.

C++编译系统把这种带有L或U形式表示的浮点数按双精度常量处理,在内存中占8个字节。如果在实数的数字之后加字母F或f,表示此数为单精度浮点数。如果加字母L或l,表示此数为长双精度数(long double)。

2.2.3 字符常量

字符常量是用单引号括起来的一个字符,例如,'a'和'?'都是合法字符常量。在对代码编译时,编译器会根据ASCII码表将字符常量转换成整型常量。字符'a'的ASCII码是97,字符'A'的ASCII码值是65,字符'?'的ASCII码值是63.ASCII码表中还有很多通过键盘无法输入的字符。可以使用'\ddd'或'\xhh'来引用所有ASCII码表中的字符。\ddd是1~3位八进制数所代表的字符,\xhh是1~2位十六进制数所代表的字符。例如,'\101'表示ASCII码A,\x0A表示换行等。

转义字符的应用示例如下:

#include <iostream>
void main(){
    std::cout<<"A"<<std::endl;
    std::cout<<"\101"<<std::endl;
    std::cout<<"\x41"<<std::endl;
    std::cout<<"\052"<<std::endl;
}

2.2.4 字符串常量

字符型常量是由一队双括号括起来的零个或多个字符序列,例如"Hi there"或"Nice to meet ya"。    ""表示一个空字符串。

同样,''也表示空字符,而NULL时一种特殊的数据类型,表示空的意思。有的编译器把它编译成零,有的则编译成其他值。

字符串常量实际上是一个字符数组,可以将字符串分解成若干个字符,字符的数量时字符串的长度。字符串常量一般都是用来给字符数组变量赋值或是直接作为实参传递,为告知编译器字符串已经结束,一般在给字符数组赋初值时在字符串的末尾加上字符 '\0',表示字符结束,如果不加字符结束标志,可能会出现意想不到的(又名离谱的)错误。

字符常量 'A' 与字符串常量 "A" 是不同的,字符串常量 "A" 是由 'A' 和 '\0' 两个字符组成的,字符串的长度是2;字符常量 'A' 只是一个字符,没有长度。

2.2.5 其他常量

前面讲到的都是普通的常量,常量还包括布尔 (bool) 常量、枚举常量和宏定义常量等。

        布尔常量:只有两个,一个是true,表示真;一个是false,表示假。

        枚举常量:枚举型数据中定义的数据也都是常量。

        宏定义常量:通过#define宏定义的一些值也是常量,例如:

#define PI 3.1415926

        其中PI就是常量。 

2.3 变量

变量是指在程序运行期间其值可以改变的量,本节将介绍变量的相关知识。

2.3.1 标识符

标识符 (identifier) 是对C++程序中的常量、变量、语句标号以及用户自定义函数的名称进行标识的符号。标识符命名规则如下:

        (1) 由字符、数字及下划线组成,且不能以数字开头。

        (2) 大写和小写字母代表不同意义。

        (3) 不能与关键字同名。

        (4) 名字尽量清晰明白,容易理解,应该受一定规范的约束。

这些标识符就不合法了:6A、ABC*、case

C++保留关键字如下(自我觉得写全了):

asm auto break case catch char class const continue default delete do double else enum extern float for friend goto if inline int long new operator overload private protected public register return short signed sizeof static struct switch this template throw try typedef union unsigned virtual void volatile while ……

2.3.2 变量与变量声明

每个变量都有一个变量名标识,且具有一个特定的数据类型。

变量使用之前一定要定义或声明,变量声明的一般形式如下

[修饰符] 类型 变量名标识符;

类型是变量类型说明符,说明变量的数据类型。修饰符是可选的,可以美欧。

多个同一类型的变量可以在一行中声明,不同变量名之间用逗号隔开,下面两个例子效果相同:

int a,b,c;
int a;
int b;
int c;

2.3.3 整型变量

整型变量可以分为短整型、整形和长整型,变量类型说明符分别是short、int和long。根据是否有符号还可以分为以下6种。

        整形:[signed] int

        无符号整型:unsigned [int]

        有符号短整型:[signed] short [int]

        无符号短整型:unsigned short [int]

        有符号长整型:[signed] long [int]

        无符号长整型:unsigned long [int]

方括号中的关键字何以省略,例如,[signed] int 可以写成 int。

短整型short在内存中占用两个字节的空间,可以表示的数的范围是-32768~32767。如果是无符号短整型 unsigned short表示的数的范围是 0~65545。其余见下表(不是很全,凑合就行【滑稽】):

整型变量表示的数值范围
关键字类型数的范围字节数
short短整型-32768~32767,即-2¹⁵~2¹⁵-12
unsigned short无符号短整型0~65535,即0~2¹⁶-12
int整形-2147483648~2147483647,即-2³¹~2³¹-14
unsigned int无符号整型0~4294967295,即0~2³²-14
long长整型-2147483648~2147483647,即-2³¹~2³¹-14
unsigned long无符号长整型0~4294967295,即0~2³²-14

2.3.4 实型变量

实型变量又称为浮点型变量,分为单精度float和双精度double还有长双精度long double共3种。

1.单精度

变量类型说明符为 float,该实型数据在内存中占用4个字节,表示的数值范围是-3.4× 1/10³⁸~3.4×10³⁸。声明:float a;

2.双精度

变量类型说明符为 double,该实型数据在内存中占用8个字节,表示的数值范围是-1.7e-308~1.7e308。声明:float a;

3.长双精度

2.3.5 变量赋值

2.3.5 变量赋值

2.3.6 变量赋初值

2.3.7 字符变量

2.4 常用数据类型

2.4.1 整数类型

2.4.2 浮点类型

2.4.3 字符类型

2.4.4 布尔类型

后面作者还会持续更新,求点赞+关注+收藏,谢谢啦

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++小盆友

你的鼓励将是我创作的最大动力呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值