C/C++基本知识(二)

来源:互联网 发布:如何统计重复数据 编辑:程序博客网 时间:2024/05/24 23:15

from http://blog.csdn.net/peng825223208/article/details/41476581

接上:

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)读文件 freadd)写文件 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";}elsecout<<"工作日\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指针调用本类的成员函数和成员变量


0 0
原创粉丝点击