面向对象程序设计包括:类的声明部分,类的使用部分。
结构, 联合和枚举类
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 // 只是单纯的文本替换
对比:
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 分配的基本形式:
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]
}
输出:
对引用注意的地方:
- 不允许建立void类型的引用.
- 不能建立引用数组.
int a[4] = "abcd";
int &ra[4] = a; // 错误
见注释说明.
int n = 3;
int &&r = n; // 错误, 不能建立引用的引用
int &*p = n; // 错误, 不能建立指向引用的指针
- 可以将引用的地址赋值给一个指针, 此时指针指向的是原来的变量.
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; // 可以
- 引用只在声明的时候带有引用运算符, 其他地方不带, 若出现 & 那是地址操作符.