C++知识点综述
1.对比于C函数与C++函数,C++函数特色增加了重载,内联,const和virtual四种新机制
2.重载和内联机制既可以用于全局函数也可以用于类的成员函数
3.const和virtual机制仅用于类的成员函数
4.重载的核心在于参数,参数有三个基本点:(1)类型(2)数量(3)顺序。切记与返回值无关。注意作用域(全局函数和类的成员函数同名不算重载)。另外,因为const在成员函数后面修饰this指针,所以属于重载范畴。
5.覆盖的本质是重写。派生类重写基类虚成员函数
6.求字符串的长度,strlen函数的值总比sizeof小1
7.声明函数原型时不需要指明每个函数参数的名字,只需要说明每个参数的类型和返回值类型就可以
8.所有的表达式都有值
9.程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所带来的编译工作量
10.类的静态数据成员需要类外进行初始化【重点】
11.当将一个类S定义为另一个类A的友元类时,类S的所有成员函数都可以直接访问类A的所有成员
12.如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这个函数自动继承基类中虚函数的特性。
13.字符串’hello,world”在内存中存放时,占用12个字节的空间,但是strlen函数的值为11,sizeof关键字的值为12
14.用new动态申请的内存空间,必须用delete来释放
15.重载是指在同一个类中,同名函数,参数不同;
16.覆盖是指派生类重写(遵循三同原则)基类的虚函数
17.隐藏一则:派生类与基类的函数同名,但是参数不同,与virtual无关;(不同于重载)
二则:派生类与基类的函数同名,并且同参,但是无virtual;(不同于覆盖)
18.友元函数在标准命名空间中必须要提前声明
19.友元在非标准库下,不需要提前声明
20.如果一个指针等于NULL,那么这个指针被free多次不会出现问题
21.如果一个指针非空,仅且仅可释放一次,并且要置空
22.如果创建的是静态局部或者是全局对象,则对象的位模式全部为0,否则将会是随即的
23.析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用
24.因为delete操作符只能清空堆空间而不能清除桟空间,如果强行清除栈空间内存的话将导致程序崩溃
25.类是一个抽象的概念,并不是一个实体,并不能包含属性值(这里来说也就是构造函数的参数了),只有对象才占有一定的内存空间,含有明确的属性值
26.C++规定,所有的全局对象和全局变量一样都在主函数main()之前被构造,函数体内的静态对象则只构造一次,也就是说只在首次进入这个函数的时候进行构造
27.类成员的构造是按照在类中定义的顺序进行的,而不是按照构造函数说明后的冒号顺序进行构造的,这一点需要记住【重点】
28.静态数据成员受private控制符的作用
29.静态数据成员可以被类的对象调用
30.静态数据成员可以直接用类名调用
31.静态数据成员必须在类外初始化
32.当类中含有const,reference成员变量以及基类的构造函数都需要初始化列表【重点】
33.普通构造函数可以被隐式调用,而explicit构造函数只能被显式的调用
34.析构函数主要释放类的构造函数在整个生命周期中获得的资源
35.复制构造函数的用途:
(1)一个对象以值传递的方式传入函数体
(2)一个对象以值传递的方式从函数返回
(3)一个对象需要通过另外一个对象进行初始化
36.常量与只读变量是有区别的
37.在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。
38.C++ const变量引用传递和最普通的函数按值传递的效果是一模一样的,它禁止对引用的对象的一切修改,唯一不同的是按值传递会先建立一个类对象的副本,然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效。
39.正象内置类型能够定义const对象一样(const int r=10;),用户自定义类型也可以定义const对象(const X px(10);),编译器要保证这个对象在其生命周期内不能够被改变。如果你定义了这样的一个const对象,那么对于这个对象的一切非const成员函数的调用,编译器为了保证对象的const特性,都会禁止并在编译期间报错。所以如果你想让你的成员函数能够在const对象上进行操作的话,就要把这个函数声明为const成员函数。
40.注意:类的构造和析构函数都不能是const函数。【重点】
41.mutable int a; 这样的成员变量是可以在const函数中随意改变的
42.const成员函数中如果要修改成员变量的值,一种是方法上面一条思路;一条是对this指针强制类型转换使用关键字const_cast。去掉其常性。
43.在类设计中实现常量,考虑枚举【重点】
44.
const int a=100;
int br[a];
这个编译是可以通过的
45.
const int ar[2]={10,100};
int br[ar[1]];
这个是错误的
因为ar在这里是一个数组,数组属于一个集合,而编译器是不会为它分配内存的,而一个不存在的内存如何知道它的内容呢?
46.const在成员函数中的三种用法(参数、返回值、函数)要很好的使用
47.在参数中使用const应该使用引用或指针,而不是一般的对象实例
48.不要轻易的将函数的返回值类型定为const
49.C++的模板template有两种,一种是针对Function;一种是针对class
50.
(1)malloc/free是C语言标准的库函数 new/delete是C++的运算符
(2)都是在堆(heap)上进行动态的内存操作。
(3)用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。
(4)delete 会调用对象的destructor,而free 不会调用对象的destructor.
51.枚举详解
1>枚举是一种类型
2>默认的,第一个枚举成员赋值为0,后面的每个枚举成员的值比前面的大1
3>枚举成员本身是一个常量表达式,不可以改变其值
4>也可以显式的定义枚举成员的值,随机的指定其中某个值,其前的成员值为默认值,其后的成员值大一
52.内存分配方式
动态分配(用malloc,new分配);
栈上分配(局部变量)。
内存分为:全局数据区,文字常量区,代码区,栈区,堆区。
53. 临时对象一般创建在值传参或者返回对象时
54. 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。
55.C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的。
56 C++的类和C里面的struct有什么区别?
c++中的类具有成员保护功能,并且具有继承,多态这类oo特点,而c里的struct没有。
57. 内联函数在编译时展开,宏在预编译时展开
在编译时内联函数可以直接被嵌入到目标代码中,而宏在预处理是只是仅仅的文本替换
内联函数可以完成类型匹配,语句正确的判断,而宏不具有。
宏不属于函数,内联函数属于函数
宏在定义时要小心处理宏参数,以免出现二义性
58.内联是以代码膨胀为代价的,仅仅省去了函数调用的开销,从而提高了函数的执行效率,一般适合于使用频率高,并且代码量简单的函数。
59.inline既消除了宏定义的缺点,又继承了它的优点
60.#pragma pack (1)设置对齐标准
61.引用与指针的区别
(1)初始化要求不同 前者必须要初始化。
(2)可修改性不同 前者一旦被初始化,它就不能被另一个对象引用,而指针在任何时候都可以指向另一个对象
(3)不存在NULL引用 引用必须要确定某个对象
(4)测试的区别 引用不会指向空值,所以使用引用之前不需要测试它的合法性。而指针则需要进行经常测试
(5)应用的区别 如果指向一个对象后就不会再改变指向,使用引用。如果在不同的时刻指向不同的对象,应该使用指针。
Good Good Study, Day Day Up.
顺序 选择 循环 总结