C++语言中级(一)

2014-11-24 09:57:49 · 作者: · 浏览: 0

《c++语言中级》 知识点总结:
1. 类型决定了:大小、行为、存储方式、编译器检查依据;
每个变量都有name、type、address、value、reference;
变量生存周期从短到长: 临时、栈区、全局静态、堆区;
2. 对象在内存中的布局:
对象------仅有数据成员(非静态)this;
函数------代码区
3. 重载:同一个作用域内的几个函数,函数名相同,形参表一定不同(个数、类型、次序)。
4. 成员函数的默认形参(从后往前)与函数的重载不允许同时出现--------避免二义性。
5. 常函数的const修饰的是this指针。
6. 类中的成员函数如果不调用,可以不实现。
7. Inline函数在编译时替换,要尽量简洁,不允许有循环、switch、break、递归、goto、异常等。
8. C语言没有引用,&为取地址符。C++才有引用类型,int &b =a; 引用变量可以传递定义int I = 5, int &ii = I; int &iii = ii;可以定义对指针的引用,int *p = &I, int &r = *p;
9. 构造函数: 申请空间,执行初始化列表,执行构造函数体。
初始化列表按照成员数据声明的次序执行。
构造函数调用形式:
显示调用---------clock *p = new clock(8,30);
隐式调用---------clock myclock(8,30);
Explicit关键字关闭构造函数的隐式类型转换功能【float f(100); A a=10; A a(10);都暗含隐式类型转换】。
默认构造函数: 没有参数,仅申请内存空间,构造对象。
10. 拷贝构造函数调用场景:
(1). 直接调用 Clock a; clock b(a);
(2). 形实结合 void fun(clock x); fun(a);
(3). 返回对象 clock fun(void);
(4). Clock b =a;//拷贝构造 clock s; s=a;//赋值而非拷贝构造
默认拷贝构造函数:申请空间,创建对象,并不初始化。
11. 析构函数调用场景:
(1). }块结束或文件结束; (2). Goto; (3).异常catch(); (4).delete([])
12. C++能自动产生的6个函数: 构造、拷贝构造、赋值、析构、取址、取常址。
13. 引用相当于指针,在类中占存储空间(但引用在类外不占用空间???)
14. 不要让成员函数返回一个非常引用或常指针(如何理解???)。
15. 类之间的关系有:组合、继承、友元、聚集、内嵌、局部、模板;
C++中struct、union也是类,class默认为private,struct默认为public;
类中镶嵌enum提供类内使用的常量.
16. 初始化列表:
(1). 初始化列表应罗列全部组合对象;
(2). 被组合类一定要提供无参构造函数;
(3).初始化列表必须按照数据成员的声明次序写,构造函数和拷贝构造函数可以使用初始化列表;
(4).常用于类组合和类继承,适用于对象初始化,在创建对象时完成的工作皆应交由初始化列表去做,在构造函数体内赋值已经晚了,因为对象创建已经结束了;
(5).类成员中的const对象和引用必须用初始化列表,因为这两种对象声明后必须马上初始化,在构造函数中赋值是不行的。
17. 必须用初始化列表的场合:
(1).引用和指针成员;
(2).常数据成员;
(3).被组合的类的构造函数带参,而组合类创建对象时;
(4).基类构造函数带参,子类创建对象时;
(5).派生类的构造函数应该在初始化列表中调用基类的构造函数;
18. 名字的搜索次序: 本模块--->本类--->本命名空间--->全局
19. 类的静态成员:
静态成员函数没有this指针,因而不能直接访问对象的数据成员;
类的静态数据成员和函数成员具有类属性,不占用对象内存空间;
静态不继承,静态成员函数不能定义为虚函数,不必重载也不必为常函数。
20. 友元
分为友元函数,友元成员函数,友元类;
友元函数不能和寄生类的成员函数同名;

友元和静态都通过”对象名.”访问,一般以参数形式传入;
21. 只有类的成员函数才能为常函数,常函数不能修改类的数据成员、常对象、常数据成员、常引用;
常对象不能修改数据成员,不能调用非长成员函数。
22. friend仅于声明;
inline仅放于实现;
static放于类内声明,类外不带;
默认形参在声明时带,实现时不带;
常函数Const在声明和实现都带,常函数const修饰的是this,因而不能为静态;
void print() 和void print() const 两者的实际参数表不同,为重载。
23. 建议: 不修改数据成员的函数都应定义为常函数,常对象只能调用常函数,非常对象既可以调用常函数,也可以调用非常函数。
24. 对象数组 Point A[2] = { Point(2,3) },部分初始化时,编译器会将其他部分自动补0.
25. {
int I; //内部auto变量
Static int ii = &I; //错误,静态在编译时确定值,栈区运行时才有值
}
26. 访问数组的方法: int A[10]; int *p = A;
A[i] *(A+i) *(p+i) p[i]
访问成员函数的方法: p->G() (*p).G()
27. 类中的每个成员函数都有一个隐含的this指针,待在形参的第一个位置。
A a; a.G(); ------> void G(A *this); G(&a)
28. 析构函数为虚函数的原因: 当基类的指针指向派生类的对象时,如果非虚,基类的指针delete时,派生类中派生的那部分无法析构,造成内存泄露。
29. 默认拷贝构造函数和默认赋值函数,编译器会以“位拷贝”而非值拷贝的方式处理,若类中含有指针变量或引用变量,会发生“浅拷贝”或“浅赋值”。这种情况下需要自己定义拷贝构造函数和赋值函数。
30. 声明指向类的非静态成员的指针,要用“类名::”.
指向成员的指针其实是个偏移量, Int Point::*p = &Point::x.
31. 对象成员的访问方式有八种:
(1). 对象名.公有成员;
(2). 类名::静态公有成员;
(3). 对象指针->公有成员;
(4). 对象名.*数据成员指针名;
(5). 对象指针->*数据成员指针名;
(6). (对象名.*函数成员指针名)(参数表);
(7). (对象指针名->*函数成员指针名)(参数表);
(8). 对象名.类名::被隐藏的公有成员
32. 堆空间的特点: 只能用指针,无名,运行时申请,长命,低效,需要初始化.
New/delete会调用构造函数和析构函数;
Float (*cp)[9][8]; cp = new float[10][9][8];
Point &rp = *(new Point(2,3)); delete &rp;
Point *p[2] = { new Point(1,2), new Point(3,4)};
33. 类的聚集: 类的成员中含有指针和引用,引用了类外数据。
组合时资源固定,聚集资源动态申请,很灵活。
34. 父类构造函数私有时,不能产生子类。
前置声明的类只能声明为引用或者指针成员,不能声明为对象,因为还未实现。
35. 打捞:
继承改变了访问权限,“打捞”能够恢复访问权限
Using 类型名::成员名;
打捞不能区分重载,不能隔代打捞,只能还原不能提高访问权限,子孙类不能重复打捞.
36. 声明指向公有成员的指针:
类型说明符 类名::*指针名
类型说明符 (类名::*指针名)(参数表)
对指向成员的指针赋值:
指针名 = &类名::数据成员名;
指针名 = 类名::函数成员名;
37