这是小编第一次尝试写博客,初来乍到,还请大家不吝赐教,非常感谢!看过一些C++教程,对于小编这样的初学者来说,好多知识自己在书写C++代码时很少用到,特别是写算法题前,所以下面介绍的是一些小编认为比较重要而又实用的知识点。
C++相对于C而言,小编认为比较大的区别是C++引入了类和对象这两个概念,如果说C是面向过程的语言,那么C++就是面向对象的语言,这些对象通过调用彼此的方法进行交互。现在简要介绍一下C++里一些比较重要的术语
类-它是对某一类事物的笼统概括,也可以是一些属性的集合,包括该类事物的自身属性,以及它能行驶的行为。比如:定义某一动物的属性有:颜色,体重,定义该动物的行为有:爬,叫。
对象(此对象非彼对象 )对象是类的实例化,即将抽象的属性概念赋予一个具体的人,物,集合等。它是行驶行为的主体,承接上面的例子,狗的颜色是黑色,体重是十公斤,这只狗可以叫,也可以爬。
方法相信介绍了类和对象之后,大家对方法这个概念也有了自己的理解,即上例的“爬,叫”。从基本上说,一个方法表示一种行为。一个类可以包含一个或多个方法,方法可以对数据进行操作,也可以写入逻辑,执行所有的动作。
变量每个对象都有独特的即时变量。对象的状态是由这些即时变量的值创建的。感觉理解起来有点抽象
行注释:“//”,双斜杆是行注释,双斜杆所在行,并在双斜杆右侧的内容将不会被编译器捕获。
多行注释:“/* /”,显示在 *中的内容将都会被注释掉,不会被编译器捕获
注:初学者应该养成良好的注释习惯,对于代码量较大的程序,洽当的注释能大大提高编程效率,同时也方便以后再次查看代码,对整个程序的理解。可能开始还不知道如何有效的添加注释,那么小编可以推荐一下自己添加注释比较频繁的几个位置:声明变量,创建方法,语句块功能,创建类等等。
数据类型简单的来说,是对不同需求的数据分类,以便更加有效合理的使用内存空间,减少空间资源的浪费,这也意味着,每个变量的存储会占用一定的内存空间。常用的数据类型包括,字符型,整型,浮点型,双浮点型,布尔型等。一些基本类型可以使用一个或多个类型修饰符进行修饰,下表显示了一些常用变量类型在内存中存储值时需要占用的内存,以及该类型的变量所能存储的范围
注:bool存储值为true或false
float格式为:1位符号,8位指数,23位小数
double格式为:1位符号,11位指数,52位小数
如果觉得有些类型书写比较繁琐,或者容易书写错误,可以使用typedef声明为一个已有的类型取一个新名字。
格式为:typedef 原有类型 自定类型名;
例如: typedef int number;
number one;
这是完全没有问题的,此时的number相当于int。平时感觉用的不是很多。
除上述一些基本的数据类型之外,枚举类型是C++中的一种派生数据类型,由用户自定,如果一个变量只有几种可能的值,则可定义为枚举类型。该变量的值将会一一列出,变量的值只能在列举出来的值的范围内。
创建枚举类型的关键字为enum,一般形式为
enum 枚举名{
标识符=该标识符的值,
标识符2=该标识符的值,
......
}枚举变量;//相当与将创建枚举类型和声明枚举变量,也可分开执行
运行实例如下:
运行结果:
注:默认情况下,若不给枚举中标识符赋值,则第一个标识符的值为0,第二个标识符的值为1,以此类推
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。简单来说,创建一个变量,并说明该变量所占内存的大小,如下所示:
type variable;
type是指C++数据类型,也可以是用户自定义类型,variable是创建变量的名称,也可一行声明多个同类型的变量,如下所示:
type variable1, variable2,variable3;
int i,j,k;//i,j,k的声明
float w=1.0,y=3.6,z=4.33;//定义并初始化w,y,z
运行实例如下:
运行结果:
注:因未初始化k值,而且k为局部变量,所以程序编译报错。当局部变量被定义时,系统不会对其初始化,必须自行对其初始化。定义全局变量时,系统会自动初始化为:
- int -------->0
- char------->’\0’
- float------->0
- double---->0
- pointer---->NULL;//ponter为指针类型
变量作用域即该变量行驶的有效范围,一般来说有三个地方可以定义变量:
常量,顾名思义,是经常为某一值的量强行解释 ,而且在定义后不能进行修改。常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量,常量可以是任何的基本数据类型。那么常量是如何定义的呢,在C++中,有两种简单的定义常量的方式:
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。主要包括,算数运算符、关系运算符、逻辑运算符、位运算符、赋值运算符和其他运算符(其它不太常见,这里就不赘述了)
算术运算符
假设变量A的值为10,变量B的值为20,则:
关系运算符
逻辑运算符
假设变量A的值为1,变量B的值为0,则:
位运算符
赋值运算符
循环即重复执行同一操作,多次执行同一块代码,C++编程语言提供了以下几种循环类型。下面直接在程序中解释这些循环的用法。
运行实例如下:
运行结果如下:
如果条件为“真”,则进入相应的代码块(这是必须的),如果条件为“假”则进入另一代码块(可选)。
if语句:一个if语句由一个布尔表达式后跟一个或多个语句组成,这些语句共同决定结果的真假。
if…else语句:当if 条件不满足时,则执行else里的代码块,当然也可以使用,if…else if…else,else if即意为当前面几个条件都不满足,而且满足该条件时,才会执行内部的代码块。
运行实例如下: 运行结果:
switch语句:一个switch语句允许测试一个变量等于多个值时,执行不同代码块的情况。
运行实例如下:
函数即一起执行并完成某项任务的语句块,比如最常见的main函数,它的功能是启动程序。当然你也可以定义自己的函数,比如加法函数,减法函数等等。前面提到的循环可以多次执行某一块代码块,但它是没有间隙的,且是在同一地方多次执行同一操作。而函数,则可以在任意地方执行,随着函数传入的参数不同,函数运行的结果也不同。
函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。C++标准库提供了大量的程序可以调用的内置函数,这些函数不需要用户定义,只需引入相应的头文件,就可以直接调用。具体什么头文件,得由你调用的函数决定,度娘知道 。
定义函数的一般形式如下:
return_type method_name(parameter list)
{
the whole code of the function
}
下面列出一个函数的所有组成部分:
返回类型:即return_type,当函数执行完后,是否将得到的值发送给调用该函数的代码块中,return_type,则是该函数和调用代码块连接口,该类型可以是int,float,double等一系列基本数据类型,也可以是用户自定义类型,若不用返回值,可直接设为void.
函数名称:该函数的名称,函数名和参数列表一起构成了函数签名。
参数:即调用函数的代码块进入该函数的入口,可以通过该入口向参数传递一个或多个值,参数是可选的,也就是或函数可能不包含参数。这些参数在进入函数时被创建,退出函数时被销毁,当调用函数时,有三种向函数传递参数的方式:
- 传值调用:将参数的实际值赋值给函数的形式参数。修改函数内的形式参数对实际参数没有影响,也是平时用的比较多的参数传递方式。
-运行实例如下:
- 指针调用:相当与把实际参数的地址传值给形式参数。修改函数内的形式参数会对实际参数有影响。
运行实例如下:
- 引用调用:把参数的引用赋值给形式参数。修改函数内的形式参数会对实际参数有影响。
运行实例如下:
函数主体:执行具体功能的代码块。
有时候需要用到随机数,比如在验证一些函数功能的准确性时,使用随机数是一个不错的选择。关于随机数生成器,有两个相关的函数。一个是rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用srand()函数。
运行实例如下:
数组即同一类型变量的组合,它可以存储一个固定大小的相同类型元素的顺序集合。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,下标为0。最高的地址对应最后一个元素,下标为数组长度-1。
声明数组:type arrayName[arraySize];
eg. int num[10];//意为声明了数组长度为10的整型数组,显然数组长度必须大于零。
初始化数组:
-可逐个初始化数组,也可使用一个初始化语句。
eg. int num[5]={1,2,3,4,5};
-为数组中某个元素赋值。
eg. int num[5];
num[0]=20;
访问数组元素:数组元素通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边,eg. int a=num[4];
多维数组:多维数组最常用的是二维数组,也是最简单的,因为和矩阵相似,所以用处也比较多。声明一个x行y列的二维整型数组,形式如下:
type arrayName[x][y];
运行实例如下: 传递数组给函数:比较常用的是,通过指定不带索引的数组名来传递一个指向数组的指针。传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址,传递一个一维数组作为参数,有以下几种方式。
void methods(int *param){}//形式参数是一个指针
void methods2(int param[10]){}//形式参数是一个已定义大小的数组
void methods3(int param[]){}//形式参数是一个未定义大小的数组,通常还会加一个数组大小的形式参数
从函数返回数组:C++不允许返回一个完整的数组作为函数的参数。但可以通过不带索引的数组名来返回一个指向数组的指针。而且,C++不支持在函数外返回局部变量的地址,除非定义局部变量为static变量。
运行实例如下:有static时
无static时:
C风格字符串:字符串实际上是使用null字符’\0’终止的一维字符数组。由于在数组的末尾存储了空字符,所以字符数组的大小比单词“false”的字符多一个。
运行实例如下:
C++中有大量的函数用来操作已null结尾的字符串。
C++中的String类:使用string类,需要引入头文件#include。
学习C++的指针简单枯燥 又有趣乏味 ,指针的功能很强大,动态内存分配没有指针是无法执行的。但是越强大的东西,就说明其构造也会相对复杂点,要想掌握好也并非易事。上文提到过,每个变量都有一个内存位置,每一个内存位置都定义了可使用连字符号(&)运算符访问的地址,表示了在内存中的一个地址。
那么什么是指针呢?指针是一个变量,其值为另一个变量的地址。既然指针是变量,那么它也同样满足变量声明的规则,必须在使用指针存储其他变量地址之前,对其进行声明。一般形式为:
type var_name;
指针的几个常用操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。通过使用一元运算符“”来返回位于操作数所指定地址的变量的值。
NULL指针:在声明变量的时候,如果没有确切的地址可以赋值,为指针变量赋一个NULL值是一个良好的编程习惯。赋值为NULL值的指针被称为空指针。
引用是某个已存在变量的另一个名字。一旦半引用初始化为某个变量,就可以使用该引用名称或变量名称指向该变量。
引用和指针的区别:
-不存在空引用。引用必须连接到一块合法的内存,而存在空指针。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
运行实例如下:
学习C++,数组是我们最开始接触的数据结构,但数组仅允许存储相同类型数据项的变量,而结构是C++中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。定义结构的格式如下:
struct type_name{
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
}object_names;
对如上代码进行简要说明,type_name是结构题类型的名称,member_type1 member_name1是标准的变量定义。在结构定义的末尾,最后一个分号前,可以定义多个结构变量,举例如下:
struct Books{
char title[50];
int page;
float price;
}onebook;
访问结构成员:成员访问运算符(.)。
类是C++的核心特性,通常被称为用户定义的类型。它包含了数据表示法和用户处理数据的方法。类中的数据和方法成为类的成员。函数在一个类中被称为类的成员。
C++类定义:定义一个类,本质上是给一个物体,或者一个抽象概念搭建一个框架,告诉人们有这么一类东西存在,但却不能指名道姓的找出这么一个实例,它们有自己特有的属性和行为。定义类是以关键字class开头,后跟类的名称。类的主体是包含一对花括号中。类定义后必须跟着一个分号或一个声明列表。
class animal{
private:
string name;
int age;
public:
void eat(){
cout<<this.name<<"已经喂食";
}
}
定义C++对象:对象即为类的实例化,真实存在的个体。声明类的对象,就像是声明基本类型的变量一样。
类成员函数:即该类所拥有的方法,它可以操作类的任意对象。该成员函数可以定义在类定义内部,或者单独使用范围解析运算符::来定义。在类定义中定义的成员函数吧函数声明为内联的。在这里,需要强调一点,在::运算符之前必须使用类名。调用成员函数是在对象上使用点运算符(.)。
类访问修饰符:
- 公有(public)成员:公有成员在程序中类的外部是可访问的。
- 私有(private)成员:私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。默认情况下,类的所有成员都是私有的。额,好枯燥
- 保护(proteced)成员:保护成员变量或函数与私有成员十分相似,但是,保护成员在派生类(即子类)中可访问的。
构造函数:当我们试图创建一个对象时,会调用类的一个特殊的函数,也就是构造函数,函数功能显而易见。构造函数是一个和类名同名的特殊函数,它不会返回任何类型,毕竟它的目的只是创建对象。默认的的构造函数没有任何参数,也可以自己额外定义有参构造函数,但这样系统便不会生成无参构造函数,需自己额外设定。
析构函数:与构造函数决定了对象的生命周期,它会在每次删除所创建的对象时执行,析构函数的名称只是在构造函数前加了个波浪号(~)作为前缀,既然是结束对象的使用,那么它也不会返回任何值,与构造函数不同的是,它不能带有任何参数。
以上知识点是小编在写C++算法题前打算复习的一些知识,因为平时大多用java,所以临时写了些总结来巩固一下,至于其他C++知识点,个人认为在算法题中使用的比较少,所以这里就不介绍了,之后的日子,小编会更新leetcode题的解法,有兴趣的小伙伴可以一起哟