接上:
23、结构体初始化使用大括号或多层大括号(有嵌套时)。
结构体整体赋值:两个同类型的结构体对象之间整个结构体赋值方法:
a)将所有成员赋值一遍(最差方法)
b)使用memcpy赋值
c)用“=”号赋值
24、memset函数90%以上使用是为了一段内存清零,例如:memset(&i,0,sizeof(int)) 单位是一个字节
25、.h头文件中不可以定义变量和全局函数,因为头文件可以被多个cpp包含并使用,这样会出现重定义。
26、假如结构体做参数,不建议void print(struct SStud S)这样写,因为效率低,它又复制了一个结构体,建议使用别名和指针变量:void print(struct SStud *pStud)
27、switch中的case一般不要超过三行,否则会降低可读性。
28、a)函数声明可以放在头文件中,函数体不可以放在头文件中。
b)带extern全局变量声明可以放在头文件中
c)常量声明(定义)可以放在头文件中,因为它的值是不能改变的。
d)结构体声明(定义)可以放在头文件中
29、学习文件操作四大函数:a)打开文件 fopenb) 关闭文件 fclosec)读文件 fread d)写文件 fwrite
fopen可以查找文件是不是存在(根据它的返回值判定,返回值为NULL,则不存在,注意"r"只读模式)
void CStudent::load()//打开文件 void CStudent::save() //保存文件
{ {
FILE *fp = fopen("./stud.lv","rb"); FILE *fp = fopen("./stud.lv","wb");
DATA data; SNode *p = m_pHead;
while(fread(&data,1,sizeof(data),fp) > 0) while(p)
addHead(data); {
fwrite(p,1,sizeof(DATA),fp);
fclose(fp); p = p->pNext;
} }
fclose(fp);
}
30、学习数据结构有什么意义?(因为很多语言都有继承好的封装包)
a)增长科班素质
b)学习过程中,加强学生的代码逻辑能力
c)公司面试的时候,会考到。比如:链表排序,链表反序。
31、再次强调:清理堆内申请的内存空间(在退出时)
32、const:const int i=10;//只读的,常变量,必须初始化
33、相比于const和define,枚举是最流行的,在定义变量时。因为1)可读性比较强,2)还可以对变量类型和取值进行限定,3)还可以自动去除重复。
顺便找了个小例子:
#include <iostream>
using namespace std;
void main()
{
enum day{sunday,monday,tuesday,wendsday,thursday,friday,stadurday};
day today;
today=monday;
if (today==sunday||today==stadurday)
{
cout<<"休息日\n";
}
else
cout<<"工作日\n";
}
34、常量指针和指针变量
(1)常量指针:指向常量的指针,例如:const int i=10;//常变量 const int *p=&i //常量指针
a)格式是const在指针定义最前面,功能是防止修改指针指向内存的数值
b)进制赋值操作,允许偏移操作,允许读取操作
(2)指针常量
int *const p = &argc; *p=888//允许对指向的目标地址上的数据进行修改,不允许修改指向的地址
特点:允许赋值操作,进制偏移操作,允许读取操作
35、C++场景的link错误时:头文件有声明,cpp中没有实现。
36、指针数组的原理和使用方法
定义:数组中的每个元素都是指针变量的类型(占四个字节)
例:char str[] = {'a','b','c'};
char *pStr[] = {"abc","str","era"}; pStr[0]的类型是char *
37、类对象做成员变量的构造和析构顺序
a)类内的类对象先构造,按照类内对象定义顺序先后构造
b)类内对象构造完后,类自身才开始构造
c)析构与构造函数相反
38、函数指针:对于相似的函数,可以用到函数指针。
例如:int add(int a, int b) 和 int sub(int a, int b) 我们可以定义一个函数指针指向他们
int (*as)(int a, int b),使用时,a = add;这样之后,*a相当于add的别名了。
注意:在这加上typedef之后就成类型了,比如:typedefint (*as)(int a, int b); 定义一个as类型的对象a:as a;
39、保存和读取链表中的数据到文件的顺序为:
save:堆--->栈--->文件
load:文件--->栈--->堆
40、只读成员函数
a)只读成员函数是const置于成员函数右括号之后修饰的成员函数
b)(状态是)该成员函数不修改成员变量的数据;也就是说成员函数中出现的数据成员仅为右值
c)没有只读的构造和析构函数,只读对象和普通对象用同一个构造和析构函数
d)要对成员数据进行设计的函数,不能使用const只读函数,原因请看(b)
e)返回值是引用类型的时候,返回的变量是本类的成员,也不能使用const只读函数
f)当两个版本并存时,系统调用不带const的函数,只读的成员函数仅仅用于只读对象
g)只读对象不可以调用非只读函数,此时调用带const的只读函数。
41、只读对象
定义:关键字const限制的对象(const CTest t 或const CTest *pt或const CTest &t)
a)只读成员函数存在的意义,主要就是为了只读对象能调用本类的成员函数(读取类内部数据)
b)非只读对象也可以使用只读成员函数,非只读对象对于只读函数和普通函数都可以调用。
c)对象定义时,加上了const关键字限制之后,所有的类内数据变成了只读函数。
d)原因是在只读成员函数中,this的类型是const CTest *this(CTest是函数名),所以对象也是这样
42、只读成员变量
a)只读成员变量赋值,只能在构造函数的初始化列表中。
b)普通成员变量既可以在构造函数的初始化列表中进行赋值,也可以在构造函数或其他成员函数中赋值
c)每个对象内的只读成员变量的数值根据对象的不同,数值可能是不同的。
43、静态成员变量与静态成员函数
a)const关键字解决的问题是:只读与不只读
b)static关键字解决的问题是:是否在全局区
static关键字的用法
a)地址在全局区
b)只有在第一次进入函数时初始化
c)生命期在离开main函数之后结束
d)每次进入函数时不重新初始化,保留进入函数之前的数值
static全局变量的用法(C语言)
a)普通全局变量可以跨文件用extern关键字引用
b)static全局变量不可以用extern关键字跨文件引用
c)加了static关键字修饰,不同的源文件之间可以有同名的全局变量,因为static全局变量的含义是本源文件专有
static成员变量的用法(C++语言)
a)在类外进行全局变量的定义(初始化)
b)当类内变量前加上static关键字,就是静态成员变量
c)静态成员变量的地址在全局区,是全局性质的变量
d)只是名义上划归为某类内,但是该类的空间不包括静态成员变量
e)调用方法可以用对象或this指针,也可以直接用类名加作用域符::调用
f)静态成员变量一般定义共有,跟对象无关
44、static成员函数
a)一个成员函数如果前面加上static关键字就是全局函数的性质
b)只是名义上划分为某类内,函数内没有this指针的形式参数
c)静态成员函数内不可以通过this指针调用本类的成员函数和成员变量(因为他根本就没有this指针)