1.当我们开始着手一个项目的时候,首先要做的是创建两个文件:一个.h头文件,一个.cpp源文件
2.其中.h头文件用来做各种的头文件包含,函数声明,类的实现等等 --- 写头文件的时候第一行要写的代码是 #pragma once --- 这行代码用来保证我们的头文件不会重复包含
在头文件中实现类的时候,对于成员函数我们只需要写成员函数的声明,成员函数的实现都是放在.cpp文件中实现的 --- 实现的时候记得加上作用域告诉编译器这个函数是属于那个类的
(写函数声明的方法 : 函数的返回类型 函数名(形参列表); --- 对于类的构造函数和析构函数,它们没有返回类型,可以不用写,其中析构函数也没有形参列表,可以不用写)
对于有返回类型的成员函数,其类外的函数实现的写法如上:
函数返回类型 函数所在的类的类名::函数名()
{
函数实现
}
3.而.cpp文件则是用来写函数的实现,以及进行项目测试和项目调用。.cpp文件只需要包含我们写的头文件就可以了 用 “头文件名.h” 这个来包含 --- 在编译阶段,编译器会自动将我们包含的头文件中的数据拷贝一份到.cpp文件中
4.switch语句的用法: 注意里面要用 case 传给switch括号内的变量的可能结果,以及每个case底下都要用break;结尾,不然的话会导致连续执行,以及default来处理非可能结果的情况
5.函数在那里遇到了 return + 返回值(如果有的话); 就会在哪里结束
补充一个直接结束程序的方法 :调用exit函数 --- 写 exit(0);写出这一段代码调用函数后就会使得程序直接结束。
6.system("cls") ; --- 这一个函数调用可以起到清空屏幕的作用
7.子类中对于纯虚函数的复写可以用类内声明,类外实现
进行类外实现的时候就和正常的成员函数类外实现一样,不需要加virtual
8.
返回类型为string类型的时候 ,返回值的写法是 string("要返回的字符串")
9.
当我们想用数组来保存多个具有相同父类的不同子类我们该怎么办呢?
(使用数组的前提是数组中的元素的类型必须一样)
1.答案就是多态 --- 我们在使用多态的时候会用父类指针来指向不同的子类,此时我们就统一了数组中的类型 --- 创建一个父类指针数组,数组中的元素是一个个指向不同子类的父类指针,这样子我们就能够统一管理不同的子类了。
2.这个数组我们要开辟到哪里呢?
答案是开辟到堆区,如果开辟到栈区的话函数一结束,这个数组就被清空了
3.那么该怎么在堆区中开辟这个数组呢?

类型后面跟什么 --- 对于普通的变量而言跟(要赋给这个变量的值)
对于数组而言则是[元素的个数] --- 在c++中,通过new关键字在堆区中创建数组的时候,这个[ ]框框内的值可以是变量
这个堆区开辟代码的返回值是存放堆区中数组的首元素的内存空间的地址,我们要用一个work**指针来接收这个地址 --- 指针的地址要用二级指针来接收(指针数组的首元素也是指针)
(数组堆区内存空间的释放 --- delete[ ] 承接堆区内存空间的指针 --- 特点就是delete后面多了一个指针)
4.如果后面我们想加更多的人怎么办?
重新创建一个更长的数组,把原来的数据加进来,同时把新的数据也加进来,然后再把旧的,短的那个数组释放掉。
5.如果我们想让程序在某一行代码停止并等待我们输入后才继续操作的话,那行代码就应该写为:
system("pause"); --- 写了这行代码之后,编译器会在执行执行这行代码时停下,直到我们从键盘中输入回车符号时才会继续执行其下面的代码
6.for循环的执行顺序
for(表达式1;表达式2;表达式3)
{
表达式4;
}执行顺序为:
首次执行时,首先执行表达式1,然后判断表达式2是否成立,不成立则停止执行。表达式2成立的话,再执行表达式4,最后执行表达式3。
之后的循环,首先执行表达式2,判断表达式2是否成立,不成立则停止执行;成立的话,继续执行表达式4,再执行表达式3,直到不满足表达式2,退出循环。
7.关于 int i ; for(i=0;;)和for(int i =0 ; ;)的区别
这两个的区别就在于变量 i 的生命周期不同,对于第一种i来说,当循环结束之后i依然存在,对于第二种来说其作用域是for循环内部,当for循环结束之后,它就会被释放
一般来说我们都会选择第二种 i 变量的创建方式,因为这种方式可以较好的节省内存空间,减少cpu的计算压力
8.读文件的时候分为三种情况需要我们去分析:
所以在读文件的时候我们的逻辑步骤是:
1.判断文件是否被创建 --- 判断方法 --- 调用读文件的流对象ifstream的is_open()接口来进行判断 --- 如果文件存在则文件打开成功,则is_open()返回true,否则返回false
注意:is_open()接口的调用前提是open()接口被调用,因为is_open()接口的作用就是用来判断open()接口的结果的
(补充内容:那怕打开文件失败了,我们也需要调用close()接口来关闭文件)
2.判断文件是否为空 --- 这个需要我们增加一个参数来进行判断 --- 一般建立一个bool类型参数,如果文件为空置为ture,否则置为false
3.文件的结束标志是EOF,文件中只有一个EOF

(读取操作就是通过将文件数据变为流的方式来调用文件数据,使其进入到内存被操作,文件的数据依然是属于文件的,我们依然可以从文件中查看,只不过它以不同的形式被调用了)
一.在这里面ch这个字符变量的作用是让ifs流对象进行一次文本读取操作,如果文本为空的话 --- 即文本中只有EOF的话,ch这个字符变量会读取不到任何东西,如果不为空的话则读取一个字符。
二.每当我们从文件中读取一个字符的时候,就会有一个文件指针指向被读取的内容所处的空间(注意只有一个指针不停的移动),这个指针起到记录的功能,能够帮助编译器找到下一次读取的开头等等
三.eof()接口的作用是判断文件指针当前是否指向EOF字符,如果指向的话返回ture,文件为空否则返回false,文件不空
四.如果一个文件没有被读取过的话eof()接口是无法或得其文件指针的
综上:我们需要先读取一个字符,来获得文件的文件指针,获得指针之后再用eof()接口对指针指向的位置进行判断,来看看文件是否是空文件
4.文件存在且文件不为空
此时我们就要从文件中读取数据了
注意 ifs >> id这种读取方式的特点:
1.一个输入符只读取一次
2.已被读取的内容不会再被读取
3..如果是读取到数字类型中的话(如int , double...等等),且是第一次读取的话,则这一次读取从文件头开始(自动忽略开头空额)到文件中的第一个空格结束
如果是第二次读取的话,读取的开头是从作为第一次读取结尾的空格往后数的第一个可读取数据,如果这个数据是能够被接收数据的变量接收的数据的话(类型匹配)则读取,在遇到空格或者是不可读取的内容的时候结束,如果不是的话直接读取结束,并返回一个0给接收数据的数字类型变量
4.如果接收数据的变量的类型是字符串类型的话,则其读取只有在遇到空格的时候才停止,且它将所有的数据都以字符的形式读取
第二次读取的开头和上面一样,都是第一次读取的结束空格处往后数的第一个可读取数据
5.如果结束数据的变量的类型是字符类型的话,则每次读取都只读取一个字符,且它只有在读取了一个字符后才会结束,如果读取到EOF字符的话,则什么也不输入,输出接收数据的字符变量的话则啥也不显示
6.在cout输出的字符串中的开头加入水平制表符 \t 可以让我们这一行输出的代码更规整

7.删除一个对象的前提是这个对象是存在的,所以在进行删除操作之前我们要先判断被删除对象是否存在!
8.补充知识点:一旦以写文件打开方式打开文件的话,文件中的内容就会被清空
9.最好将存储数据到文件中写成一个函数,这样子方便我们写代码 -- 要存储调用一下函数就行了
10.switch中不能够创建变量
11.在堆区中开辟指针数组,数组中的指针都指向堆区开辟的对象,释放堆区数据时我们该怎么释放:一.首先将指针指向的堆区开辟的对象释放;二.将指针数组释放