第一章 引论
?
?? 这一章非常重要,讲了面向对象的核心概念——数据封装、继承、多态性
?
?? 数据封装机制用来实现信息隐藏
?
?? 继承实现了一般和特殊的关系,解决了软件的重用性和扩充性问题
?
?? 多态性赋予程序更多的灵活性
?
第二章 C++语言与C语言的不同
?
?? 1、动态存储分配和释放存储空间
?
?? C(malloc、free) ——>C++(new、delete)
?
?? 运算符new用于内存分配的使用形式
?
?? type *p;
?? p = new type;
??
?? type是一个数据类型名;p是指向该数据类型的指针;new从称为堆的一块空闲内存中为程序分配一块内存,其大小与
?? type类型的数据一样,该地址被存放于指针p中。
?
?? 运算符delete释放内存的方式
?
?? delete p;
?
?? p必须是一个指针,保存new分配的内存的首地址
?
?? 使用new分配的存储空间是没有名字的,只能通过指针来间接的访问它们
?
?? 典型用法:
?
?? 1.动态分配和释放单个数据的存储区
?
??
#include<iostream>?? ? using namespace std;?? ? int main(void) {?? ?????? ??? int *p;?? ??? p = new int;? ??? if(!p) {?? ?????????? ??????? cout<<"allocation failure\n";?? ??????? return 1;?? ??? }?? ??? *p = 20;?? ??? cout<<*p<<endl;?? ??? delete p;?? ??? return 0;?? }?
?
?? 2.用new运算符初始化单个数据的存储区
?
??
#include<iostream>
using namespace std;
int main(void) { ? ?int *p; ?p = new int(99); ?if(!p) { ?? ??cout<<"allocation failure\n"; ??return 1; ?} ?cout<<*p<<endl; ?delete p; ?return 0; }
?
??3.动态分配数组的存储空间
?
????
#include<iostream>
using namespace std;
int main(void) { ? ?int i = 1; ?float *p; ?int j = i + 9; ?p = new float[j]; ?/* ?动态分配数组要记住的重要一点是不能对之初始化 ?指定数组大小的量j,可以是常数、常量或表达式,不能省略 ?如果这样定义数组 int a[size] 则size必须为常数或常量, ?因为这里的数组大小在编译时就需确定,而例子中的数组空间 ?是程序运行时动态分配的 ????????? */ ?if(!p) {????????? ??????????????? ??cout<<"allocation failure\n"; ??return 1; ?} ?for(i = 0; i < 10; i++) { ?? ??p[i] = 100 + i; ?} ?for(i = 0; i < 10; i++) { ?? ??cout<<p[i]<<" "; ?} ?cout<<endl; ?delete []p; ?return 0; }
?
?? 2、内联函数
?
?? C语言中使用预处理的带有参数的宏调用来完成简单函数的调用(优点是没有系统的调用开销)
?
?? C++中引入内联函数(inline)
?
?? 例如:inline void function(inta, int b);
?
?? 编译时,在调用function的地方用函数体替换,能够加快代码执行,减少调用开销
?
?? 注意:内联函数体内不允许有循环语句和开关语句?? 函数体一般不宜过长
?
?? 3、const说明符
?
?? 1.说明符号常量
??
?? C语言中使用? #define PI? 3.14???? PI不是真正的符号常量,仅仅是一个字符串,没有类型,不占用存储空间,不能取
?
?? 其地址,只是在预处理时,将它替换为3.14
?
?? C++中使用? const float PI = 3.14 PI是真正的符号常量,有类型,需要占用存储空间(实际上存放在常量数据区),
?
?? 能够取其地址,但不能被无const约束的指针指向,它的值不能被修改
?
?? 2.说明函数的形参
?
?? void fun(const int num);//参数num被认为是常量,只能使用,不能进行修改
?
?? 3.说明指针变量
?
?? 指向常量的指针?? const? type? *p;
?
?? 该类指针可以指向常量,也可以指向变量;只是从指针的角度而言,它所指向的是常量,通过该指针不能修改它所指向的
?
?? 数据;可以不初始化
?
???常指针? type? *const p;
?
?? 把指针本身而不是它指向的对象声明为常量;必须初始化;一旦初始化,不能指向其它数据;可以通过指针修改数据;
?
?? 实际上,该指针只能指向变量,而不能指向真正的常量
?
?? 指向常量的常指针? const? type ?*const? p;
?
?? 必须初始化;该类型指针可以指向常量,也可以指向变量;但通过该指针不能改变它指向的数据;初始化后也不能指向
?
?? 其它数据
?
?? 4、函数原型
?
?? C++需要所有函数具有函数原型,使得C++语言提供更强的类型检查
??
?? (被调用函数的参数类型定义和类型转换;函数的参数个数;函数的返回类型)
?
?? 函数重载:具有相同的函数名,但有不同的参数表和各自的函数体
?
?? 5、缺省参数
?
?? void? func(int num=0){......}
?
?? 两种方式调用func
?
?? func(10);//传递显示的值,则num的初始值为10
?? func();//无对应的实参,则num的初始值为0
?
?? 缺省参数提供了程序员处理更大复杂性的一种方法
?
?? 若有多个参数,则所有取缺省值的参数都必须出现在不取缺省值的参数的右边
?
?? 在使用具有缺省参数的函数时,若该函授名还被重载,要谨防二义性
?
?? 例如:void? func(int? x=1) {......}
??????????? void? func() {......}
?
?? 则函数调用func() 就不知道是调用哪一个函数了??