笔记整理自菜鸟C++教程
一、C++基本特征
面向对象,区分大小写
二、头文件书写
写法:include<>
或include""
stdio.h/iostream.h/iostream的区别
- stdio.h是C的标准I/O库,iostream.h是C++非标准输入输出流,iostream是C++标准输入输出流。
- iostream.h继承C语言的标准库文件,未引入名字空间,输出直接引用cout<<x;
- iostream引入cout的两种方法:using namespace std; cout<<x;或using std::cout; cout<<x;
三、命名空间:using namespace std;
- 标准库里的名字都加上 std:: 的前缀,你必须用std::vector来引用vector类。写上上述句子可以不用写前缀直接写vector。
- 命名空间为变量或函数等实体定义范围
- 定义命名空间:namespace命名空间名{}
- 调用命名空间中函数:命名空间名::函数名();
- using指令:使用 using namespace指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。故std也是命名空间
四、变量
- 变量声明:
extern
五、常量
- 用大写字母表示常量
- 常量定义:
#define或const关键字
六、存储类
- static:局部变量,文件内全局变量
- extern:所有文件可见变量
- thread_local:线程内变量
七、函数参数传递
- 值:
i—>j
,实参i,形参j,i赋值给j - 指针:
&i—>int *j
,实参i,形参j,j是i的指针 - 引用:
i—>int&j
,实参i,形参j,i和j相同 - 数组的参数传递:实参数组名—>int 形参数组名,数组长度常数—>int i
指针的理解: int* 用来定义指针,定义int * j,定义赋值int* j=&i,赋值j=&i。理解上int和* 在一起,写法上* 指针名在一起。
引用的理解: &仅表示引用,定义赋值int& j=i。理解和写法都是int和&在一起。`
八、字符串
- C风格字符串:char 数组名={‘w’,‘e’,‘\0’}或“we”
- 字符串函数:
strcpy(s1,s2)//复制,strcat(s1, s2)//连接,strlen(s1)//长度,strcmp(s1, s2)//比较大小
- 字符串指针p,* p为第一个元素,* (p+1)为第二个元素
- 字符串函数:
- C++中的String类
#include <string>
string str1 = "Hello";
- =复制,+连接
九、结构体
- 声明方法1:stuct 结构体类型名{};
- 声明方法2:typedef struct 结构体类型名{}结构体类型名;
- 结构体和类的声明,大括号后有分号,而函数没有
- 指向结构的指针:声明和赋值同其他,调用结构体中成员用->
十、时间
#include <ctime>
time_t 变量名 = time(0);
该函数返回系统的当前日历时间,自 1970年1月1日以来经过的秒数。
十一、基本输入输出
头文件: <iostream>
标准输出流cout,流插入运算符 <<
cout << "Value of str is : " << str << endl;
- <<可以多次使用,str为字符串变量名或字符数组名,end1为换行符
- 在正式输出前使用cout方法修改输出格式
标准输入流cin,流提取运算符 >>
char str[50];cin >> str;
- “>>”可使用多次,相当于多行合并
- C++ 输入多个字符,中间用一个字符隔开,cin.get()是可以忽略掉一个字符的:
cin>>a;cin.get();cin>>b;
cin的方法
cin.getline(str,50);代替cin>>str;
添加cin.ignore()到cin>>str后会忽略掉之前读语句留下的多余字符
标准错误流cerr,<<
cerr 对象是非缓冲的,每个流插入到 cerr 都会立即输出
标准日志流clog,<<
clog 对象是缓冲的,每个流插入到 clog 都会先存储在缓冲区,直到缓冲填满或者缓冲区刷新时才会输出
十二、类和对象
- 类就是模型,对象就是按照模型打造的复数实体
- 定义类:
class 类名{类主体}
- 定义对象:
类名 对象名
- 类访问修饰符:默认是private 的,除继承类型的写法和Java一致写在同行最前外,其余写法(成员变量和成员函数)如下
12.1 类的函数
- 分类:成员函数,构造函数(特殊的成员函数),析构函数(特殊的成员函数)
- 声明:类里面正常声明,类外定义的函数名为:类名::函数名
- 有关成员函数中变量的声明都在类中声明
类构造函数
- 创建类的新对象时执行,函数名和类名相同,不反回任何类型包括void,可在类中声明并在类外定义或者不写。class line{line();};
- 默认构造参数没有参数,函数定义为line:line(void),可带参数。这里带参数的构造函数不需要像Java前置不带参数的构造函数。没写构造函数则系统生成默认构造函数。
- 创建对象:
类名 对象名(无参)
,类名 对象名(参数)(含参)
- Java和C++面向对象的区别:Java主函数名为文件名而C++为int main(),Java创建对象要new构造函数并且写法也不同,Java成员函数定义写类里面而C++成员函数声明写类里面定义写类外面,Java所有函数都是类的成员函数而C++则是独立函数和成员函数混用,Java成员函数中对象的参数需要用this.而C++直接写变量,Java一般通过构造函数给对象添加参数而C++可以通过其他成员函数一个一个给对象添加参数此时类里的一套变量独立出来
类析构函数
- 删除对象时执行(这个删除是程序结束默认执行的),和构造函数同,函数名前加~
- 类构造和析构函数的特殊就是主动性,至于内容可以复制也可以仅输出。
拷贝构造函数
- 对象初始化方式:构造函数/对象赋值(使用拷贝构造函数)
友元函数
- 独立定义的函数,在类中用friend 函数名来声明,该函数可以直接访问该类的任何成员
- 友元不是类的成员,没有this指针
this的使用
- 用于参数为对象的成员函数,因为成员函数需要对象来使用,则为box1.compare(box2),this指代box1即调用对象
- 构造函数不使用
this->
12.2指向类的指针
使用同结构体
12.3类的静态成员
static声明,静态成员在类的所有对象中是共享的
十三、C++面向对象
13.1 继承
- 定义:
class 派生类名:public 基类名
- 派生类继承所有非private成员,继承所有基类方法除构造函数、析构函数、拷贝构造函数、重载运算符、友元函数
- 继承类型:公有继承public原样继承,保护继承protected基类的共有成员降级为保护成员,私有继承同上类推全部降级为私有成员
- 多继承:一个子类可以有多个父类,多组继承类型基类名间用逗号隔开
13.2 重载
函数/运算符多个定义,不同定义的参数不同
13.3 多态
- 继承基类的派生类中重写基类的函数,则会无效
- 在基类中对应函数整体前加virtual则执行派生类的函数,这种函数被称为虚函数(在基类中)
- 纯虚函数:无实体的虚函数,声明-virtual 返回值 函数名() = 0;
- 虚函数的重载性和它声明的权限无关,因为重载之时并没有与父类发生任何的调用关系,故而重载是被允许的。
- 接口/抽象类
- 如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。
- 设计抽象类的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。
十四、文件和流
头文件<iostream>
和<fstream>
14.1 数据类型/类
- ofstream输出文件流,创建文件并写入
- ifstream输入文件流
- fstream文件流,同时具备输入输出
14.2 打开文件
声明对象,使用对象中的open方法
第一个参数为文件名称和位置,用双引号
第二个参数为文件被打开的模式,多模式用 | 分隔
ios::app追加至文件末,ate定位至文件莫,in打开文件用于读取,out打开文件用于写入,trunc若文件存在其内容被截断即文件长度为0
14.3 关闭文件
方法close();
14.4 写入文件
用ofstream/fstream的对象(其本身是类,对象是该文件),<<,同cout对象
14.5 读取文件
用ifstream/fstream的对象,>>,同cin对象
14.6 文件位置指针(本身是方法)
文件位置指针:seekg(长整型,定位模式)
定位模式:不写默认从头开始,ios::cur当前位置,end末尾
十五、异常处理
- try:它里面放置可能引发异常的代码,不写用来触发异常的代码
- 正常运行try中代码,try中代码出现异常,系统自动生成一个异常对象,寻找能处理该异常的catch块,通过catch后的异常类型识别
十六、动态内存
内存分为两个部分
栈:在函数内部声明的所有变量都将占用栈内存。
堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。
16.1 分配内存
一般是通过指针为指针指向的变量分配内存,此时指针一般初始化为NULL,即=NULL。
16.2 动态分配内存
所需内存大小需要运行时才能确定
16.3 new分配内存,delete回收内存
- new:指针声明后,指针名 = new 变量类型;
- delete:delete 指针名;
- new 与 malloc()函数相比,其主要的优点是,new不只是分配了内存,它还创建了对象。且malloc一般需要sizeof()来确定大小,并且强制类型转换成对应类型指针。
16.4 数组的动态内存分配
- new:指针声明后,指针名 = new char[20];
- delete:delete [] 指针名;
- 二维数组:for循环,三维数组:双重for循环
16.5 对象的动态内存分配
- new:将指针声明和分配内存合一。Box *指针名 = new Box;
- 这里和Java对象创建非常像,同时构造函数被调用。只是Java中new后面跟的就是构造函数,有(),而C++没有。
- 对象数组即Box*指针名 = new Box[4];
十七、模板
十八、预处理器
十九、信号处理
-
信号名包括:SIGINT、SIGABRT、SIGFPE、SIGILL、SIGSEGV、SIGTERM、SIGHUP,信号名对应信号编号
-
函数调用:signal(SIGINT信号名, signalHandler信号函数名);
signal函数- 定义:void signalHandler信号函数名( int signum信号编号)
- 函数体内有终止:exit(sigum信号编号)
-
触发信号:ctrl c或raise(SIGINT信号函数名);用于生成信号
二十、多线程
头文件:#include <pthread.h>
20.1 创建线程
先定义线程变量,多个变量使用数组。pthread_t 线程名
线程创建函数
-
参数依次是:创建的线程名,线程参数,线程运行函数,线程运行函数参数
-
int ret = pthread_create(&tids[i], NULL, say_hello, NULL);
-
if (ret != 0)
-
ret用于判断和处理创建失败
线程退出
- pthread_exit(NULL);一个退一组
20.2 线程传递参数
- 实参:(void*)&变量名,地址进行强制类型转换成空指针
- 形参:void *新变量名,空指针
- 函数中创建一个对应变量类型的指针变量,将形参转换为对应变量类型的指针并赋值给刚创建的指针
- 此方法同用于所有以结构体作为实参的传递