面向对象程序设计包括:类的声明部分,类的使用部分。

结构, 联合和枚举类

c++ 中他们都是类型名, 和 c 语言不同:

enum Bool{FALSE, TRUE};

struct String {
char *str;
int length;
}:
union Number {
int i;
float j;
}:

c 语言定义变量时(需要带上关键字):

enum Bool done;
struct String str;

union Number x;

c++ 中定义变量时:

Bool done;
String str;
Number x;

const 修饰符

#define PI 3.14 // 只是单纯的文本替换

对比:

const float PI = 3.14;

void 指针

void 指针是一种通用型指针, 任何类型的指针值都可以赋给 void 类型指针.

void pa; // 错误, 不能声明void类型的变量
void *pc; // 正确, 可以声明void类型的指针

内联函数

inline double circle(double r) {}

带默认参数值的构造函数

void init(int x = 5, int y = 10);

编译器按照从左到右的顺序结合.

init(100, 50); // x = 100, y = 50
init(25); // x = 25, y = 10
init(); //x = 5, y = 10

函数重载

同一作用域中, 函数参数类型不同或参数个数不同, 或者两个情况都有, 函数名可以相同.

需要注意的地方:

函数返回值类型不在参数匹配检查之列, 若两个函数的参数个数和类型都相同, 只是函数返回值类型不同, 则不允许重载.

如下情况不允许:

int mul(int x, int y);
double mul(int x, int y);

函数重载与带默认值的函数在一起使用时, 可能引起二义性, 如:

声明:  
void dra(int r = 0, int x = 1, int y = 2);
void dra(int r);
调用:
dra(20);

此时编译系统不知道调用哪一个.

函数调用, 实参和形参类型不符时编译器不能识别是哪一个.

原型: 
void f(int x);
void f(double x);
调用:
int c_f(5.6);

此时, 编译器不能分辨将 5.6 转换成 int 还是 long, 导致不可分辨的错误.

作用域标识符 ​​::​

相当于 C# 的 ​​.​​ 运算符。

强制类型转换

首先 c++ 支持 c 中的强制类型转换的用法, 例如:

int i = 10;  
double x = (double)i;

另外, c++ 支持另一种格式, 类似于函数调用的格式:

int i = 10;  
double x = double(i);

c++ 两种方法都支持, 推荐后一种.

new 和 delete:

计算机内存被分为 4个 区: 程序代码区, 全程数据区, 栈, 堆.

new 分配的基本形式:

指针变量名 = new 类型;

delete释放内存基本形式:

delete 指针变量名;

new为数组动态分配内存空间:

指针变量名 = new 类型名[下标表达式];  
例如:
int *pi = new[10];

释放数组动态内存:

delete []指针变量名;  
例如:
delete []pi;

new 给简单变量分配内存并初始化:

指针变量名 = new 类型名(初值);
例如:
int *p;
p = new int(99);

new 不能对动态的内存数组储存区进行初始化

引用

格式:

类型 &引用名 = 已定义的类型名;
例如:
int i = 5;
int &j = i; // &是引用声明符, 不代表地址. = 也不能理解为赋值

引用作为函数参数:

void swap(int &m, int &n) {}

引用作为函数的返回值:

#include 

using namespace std;

int a[] = {1, 2, 3, 4, 5};

int &index(int);
int main() {
cout << a[2] << endl; // a[2]的原值
index(2) = 99;
cout << a[2] << endl; // 更改后a[2]的值

cin.get();
return 0;
}
int &index(int i) {
return a[i]; // 等价返回数据元素a[2]
}

输出:

3  

99

对引用注意的地方:

  1. 不允许建立void类型的引用.
void &r = 10; // 错误
  1. 不能建立引用数组.
int a[4] = "abcd";
int &ra[4] = a; // 错误

见注释说明.

int n = 3;
int &&r = n; // 错误, 不能建立引用的引用
int &*p = n; // 错误, 不能建立指向引用的指针
  1. 可以将引用的地址赋值给一个指针, 此时指针指向的是原来的变量.
int a = 50;
int &b = a;
int *p = &b; // 指针相当于指向a, p保存的是a的地址
const加以限制.
int a = 50;
const int &b = a;
b = 3; // 错误, 不允许改变b的值
但是可以通过a改变, 如:
a = 10; // 可以
  1. 引用只在声明的时候带有引用运算符, 其他地方不带, 若出现 & 那是地址操作符.