C++教程|菜鸟教程
reference:https://www.runoob.com/cplusplus/cpp-tutorial.html
个人觉得这个toturial是一个非常适合新手的文档,可惜少了些练习。
Notes
C++基本使用
C++包括面向对象开发的四大特性:封装、抽象、继承、多态。
数据类型大小:一般char一个字节八位,int四个字节,float四个字节,double八个字节。
内存地址的问题:在栈内存中变量的生长方向是向下的,就是后分配的地址小;在堆内存中,变量的生长方向是向上的就是后分配的地址大;
作用域的问题:一般有三个地方可以定义变量:在函数或一个代码块内部声明的变量,称为局部变量;在函数参数的定义中声明的变量,称为形式参数;在所有函数外部声明的变量,称为全局变量。全局变量定义时,系统会自动进行初始化(0或’/0’),局部变量系统不会进行自动初始化。
常量:整数常量、浮点常量、布尔常量、字符常量(\t水平制表符,相当于按tab,四个空格)、字符串常量
- 整数常量:整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。:
杂项运算符:
- sizeof:sizeof运算符返回变量的类型大小;
- .(点)和 ->(箭头):成员运算符用于引用类、结构和共用体的成员;
- Cast:强制转换运算符把一种数据类型转换为另一种数据类型;
- &: 返回变量的地址。例如 &a; 将给出变量的实际地址(地址应该是一串16进制的数字)
- *:指针运算符:指向一个变量,例如,*var; 将指向变量 var
(实参和形参)当调用函数时,有三种向函数传递参数的方式:
- 传值调用:默认C++中使用传值调用来传递函数,在这种情况下,修改函数内的形式参数对实际参数没有影响。
- 指针调用:该方法把参数的地址赋值给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
- 引用调用:该方法把参数的引用赋值给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
Lambda 函数:匿名函数的支持,本质上与函数声明非常类似,把函数看作对象;
C++中的指针:指针是一个变量,内存位置的直接地址,int *ip;
一个整型的指针,所有的指针都是一样的,都是一个代表内存地址的长的十六进制数,int是指ip的数据类型。一般指针使用流程:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。
C++中一些常用的头文件:
- <ctime>:时间和日期相关的头文件;
- <cmath>:提供数学运算;
- <vector>:向量类,一个封装了动态大小数组的顺序容器;
- <string>:字符串处理
C++面向对象
类与对象:
-
类包括访问修饰符(private、public、protected)、变量、方法;
-
定义了Box类之后,Box Box1; 声明Box1对象,其类型为Box;
-
访问数据成员:类的对象的公共public数据成员可以使用直接成员访问运算符 . 来访问;私有的成员和受保护的成员不能使用直接成员访问运算符 (.) 来直接访问;成员和类的默认访问修饰符是 private;私有 private成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员;**protected(受保护)**成员变量或函数与私有成员十分相似,但有一点不同,protected(受保护)成员在派生类(即子类)中是可访问的;
-
类的成员函数可以直接再类中定义,也可以在类内部声明成员函数,然后在类的外部使用::定义,如:
double Box::getVolume(void)
, -
类的构造函数:类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行;构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值;默认构造函数是无参的,但也可以带有参数;
-
类的析构函数:一种特殊的成员函数,它会在每次删除所创建的对象时执行;析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀;析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源;
-
类中的静态成员:静态成员:可以使用 static 关键字来把类成员定义为静态的,当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本;静态成员函数:智能访问静态成员;
继承:继承允许我们依据另一个类来定义一个类,达到重用代码功能和提高执行效率的效果;
- 基本形式:
class Dog : public Animal { // bark() 函数 };
Dog类继承了Animal类,bark()函数是新定义出来的; - 派生类可以访问基类中所有的非私有成员;一个派生类继承了所有的基类方法,但是基类的构造函数、析构函数、拷贝构造函数、重载运算符、友元函数不继承;
- 多继承:即一个子类可以有多个父类,它继承了多个父类的特性
重载运算符和重载函数:相同名称的声明,但是它们的参数列表和定义(实现)不相同;编译器比较选择最适合的定义;
多态:多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数;
- 虚函数:虚函数 是在基类中使用关键字 virtual 声明的函数,
C++高级教程
异常处理:异常处理涉及到三个关键字:try、catch、throw
动态内存:这里牵扯到堆栈的问题;
- 栈:在函数内部声明的所有变量都将占用栈内存;
- 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存;
- new :为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址; delete 运算符,删除之前由 new 运算符分配的内存;
命名空间:namespace,命名空间的定义:namespace namespace_name { // 代码声明 }
,命名空间也可以嵌套;
预处理器:所有的预处理器指令都是以井号(#)开头,这里包括:#include、#define、#if、#else、#line etc;