diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..7dca741 --- /dev/null +++ b/test.txt @@ -0,0 +1,260 @@ +冒泡排序: +for(int i=0;iarr[j+1]) + { + int temp = arr[j]; + arr[j]=arr[j+1]; + arr[j+1]=temp; + } + } +} +----------------------------------------------------------------------- +函数高级 +函数的默认参数: +1如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须要有默认值 +2如果函数声明有默认值,函数实现的时候就不能有默认参数 + +函数的占位参数: +语法:返回值类型 函数名(数据类型) + +--------------------------------------------------- +结构体作为函数参数: +将结构体作为函数作为参数向函数中传递 +传递方式有两种: +值传递:形参不会改变实参 +地址传递:会改变实参 +总结:如果不想修改主函数中的数据,用值传递,反之用地址传递 +结构体中const的使用场景: +----------------------------------------------- +1 不带头结点的头插入法创建链表: +LinkList LinkListCreate(const int n) +{ + int i; + LinkList head; + Node *p; + head = NULL; + for(;idata); + p->next = head; + head = p; + + } +} +--------------------- +不带头结点的尾插入法创建链表: +LinkList LinkListCreate(const int n) +{ + int n= 0; + + //创建一个一直指向头结点,一直指向尾结点的指针。 + LinkList head; + Node *p,*rear; + rear = head = NULL; + for(;idata); + + if(NULL == head) head=p;//创建的第一个结点。 + else rear->next = p;//链表非空 + + + rear = p;//移动尾指针 + } +   rear->next = NULL;//最后将链表的结尾设置为NULL。 +} +------------------------------------------------------------ +3 创建带结点的头插入链表。 +1 LinkList LinkListCreate(const int n) + 2 { + 3 int i = 0;LinkList p; + 4 LinkList head = (Node*)malloc(sizeof(Node)); + 5 head->next = NULL; + 6 + 7 for(;idata); +11 p->next = head->next; +12 head->next = p; +13 } +14 +15 return head; +16 } +----------------------------------------------------------------- + +4 带头结点的尾插入法创建链表。 +LinkList LinkListCreate(const int n) +{ + int i = 0;Node *p,*rear; + LinkList head = (Node*)malloc(sizeof(Node)); + rear = head; + + for(;idata); + + rear->next = p; //尾指针 指向新建结点 + rear = p;//rear指针移动 + } + rear->next = NULL; + + return head; +} +vector容器 +头文件 +向vector中插入数据 +v.push_back( ); +通过迭代器访问容器中的数据 +vector<数据类型>::iterator itBrgin = v.brgin();其实迭代器指向容器中第一个元素 +vector<数据类型>::iterator itEnd = v.end();结束迭代器指向容器中最后一个元素的下一个位置 + +STL提供的for_each(起始迭代器,结束迭代器,函数名) + +vector容器中存放自定义数据类型 +class person +{ + 数据 +} +vector +vectorv1; +vectorv2; +vectorv3; + +string构造函数 +string() 创建一个空的字符串 例如:string str +string(const char* s); 使用字符串s初始化 +string(const string& str) 使用一个string对象初始化另一个stringduixiang +string(int n,char c) 使用n个字符c初始化 + +纯虚函数:virtual 函数类型 函数名 ( )= 0; +纯虚函数 +类中只要有一个纯虚函数就是抽象类 +抽象类不能创建对象 +抽象类的子类要重写抽象类中的纯虚函数才能创建对象,否则他也是属于抽象类 +虚析构和纯虚析构 + 共性: + 可以解决父类指针释放子类对象 + 都要有具体的函数实现 +区别: + 纯虚析构无法构建对象 +纯虚析构需要声明(在类内)也需要实现(类外 ) + + + + +一,操作符重载 +实质是利用已有的c++中的关键字operator(操作符)来重写 操作符 +1.成员函数重载加号 +本质调用: +Person p3 =p1.operator+(p2) +2.全局函数重载加号 +数据类型 operator+(数据类型 &p1,数据类型 &p2) +本质调用:Person p3 = p1+p2 +运算符重载也可以发生函数重载 +重载的操作符相同 传入的参数不同 + +二,左移运算符重载 +成员函数重载 +数据类型 operator<<(cout) 简化形式 p< +template ---声明创建模板 typename ---表明其后面的符号是一种数据类型,可以 用class代替 +T---通用的数据类型,名称可以替换,通常为大写字母 +两种方式使用函数模板 +1.自动类型推导 +2.显示指定类型 +函数名<例如:int >() + +-函数名模板关键字template +-使用函数模板有两种方式:自动类型推导、显式指定类型 +-模板的目的是为了提高复用性,将类型参数化 + + +函数模板注意事项 +1.自动类型推导,必须推导出一致的数据类型T才可以使用 +2.模板必须要确定出T的数据类型,才可以使用 + +普通函数和函数模板的区别 +1、普通函数调用可以发生隐式类型转换 +2、函数模板 用自动类型推导,不可以发生隐式类型转换 +3、 用显示指定类型,可以 + +总结:建议使用指定类型的方式,调用函数模板,因为可以自己确定通用类型T +------------------------------------------------------------------------------------ +文件操作 +程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 +通过文件可以将数据持久化 +c++中对文件操作需要包含头文件 +文件类型分为两种 +1文本文件 -文件以文本的ASCII码形式存储在计算机中 +2二进制文件 -文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂他们 + +操作文件的三大类: +1ofstream:写操作 +2ifstream:读操作 +3fstream:读写操作 + +文本文件 写文件 +步骤如下 +1包含头文件#include +2创建流对象 ofstream ofs; +3打开文件 ofs.open("文件路径",打开方式) +4写数据 ofs<<"写入的数据" + +-读文件可以利用ifstream,或者fstream +-利用is_open函数可以判断文件是否打开成功 +-close关闭文件 + + +二进制文件 写文件 +1包含头文件#include +2创建流对象ofstream ofs("文件路径",ios::out|ios::binary) +3打开文件ofs.open("person.txt",ios::out|ios::binary) +4写文件 代码 +5关闭文件 ofs.close() +二进制文件 读文件 +1包含头文件 +2创建流对象 +3打开文件 并判断文件是否打开成功 +ifs.open("文件路径",ios::in|ios::binary) +if(!ifs.open_()){cout<<"文件打开失败"<