第一章 引论
这一章非常重要,讲了面向对象的核心概念——数据封装、继承、多态性
数据封装机制用来实现信息隐藏
继承实现了一般和特殊的关系,解决了软件的重用性和扩充性问题
多态性赋予程序更多的灵活性
第二章 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() 就不知道是调用哪一个函数了