class 基础
1. inline function
两种形式:
(1) 类定义里面实现的函数即为inline function
(2) inline 定义, 实现时开头不用加inline
class A
{
public:
void f1();
inline void f2();
};
void A::f2(){}
2. Member Function Overloading
参数列表不一样即可, 注意默认参数的设置可能会导致二义性
3. Constructor
(1) 默认构造函数对每一个元素调用各自的构造函数.
特点: 无返回值, 可以定义多个
(2) 构造函数与数组:
需要注意定义该类型本身时,所有元素都会被构造
但是构造指针数组时, 默认为NULL, 不会调用构造函数.
初始化函数可以保证使用元素时, 不会因为没有初始化导致问题.
4. Copy Constructor
T( T &t): 不能用pass by value, 想想也是, 不然会不断调用copy constructor啊.
用途:
(1) 初始化
T a(b);
T a = b;
(2) 函数调用, pass by value
(3) 函数返回值
5. 转换类型构造函数
特点: 只有一个参数
目的: 用于类型的自动转换, 通常会生成一个临时变量, 将右边变量类型转换为左边变量的类型.
6. Destructor
(1) 没有返回值, 也没有参数, 就一个
一般用内存管理, 销毁new产生的空间
默认存在一个缺省构析函数, 不会释放申请的内存.
~T()
(2) 构析函数与数组
一般数组, 程序结束时自动调用
new 数组, 仅在delete []p 时会调用, 不然程序结束也不会调用.
(3) 构析函数与static, global变量的调用顺序
static 变量和global 变量在main函数结束时被销毁, 按后进先出的方式调用构析函数.
7. 静态成员变量和静态成员函数
关键字 static:
理解: 可以认为这是将一个global 变量 放在了类里面. (应为该变量与类密切相关)
(1) 所以当计算类的大小时, 它不会不会被计算进去.
(2) 而且必须在类定义外面对静态成员变量定义或初始化.
不需要再加static 关键词,
int A::count = 1;
(3) 包含类的特性, 与具体的某个实现无关,所以static function 不能使用非static变量.
8. 封闭类和成员对象
当成员对象是一个封闭类时, 必须使用初始化列表进行初始化.
或者要定义封闭类的默认构造函数.
相当于调用默认构造函数, 再用operator=
#include <iostream>
using namespace std;
class Base {
public:
int k;
Base(int n = 0):k(n) { }
Base& operator=(const Base &b){ k = b.k;return *this;};
Base (const Base &b){k = b.k;};
};
class Big {
public:
int v; Base b;
// 在此处补充你的代码
Big(int v_):v(v_),b(v_){}
Big(Big &a)
{
v = a.v;
b = a.b;
}
};
int main() {
Big a1(5); Big a2 = a1;
cout << a1.v << "," << a1.b.k << endl;
cout << a2.v << "," << a2.b.k << endl;
return 0;
}
(2)或者使用初始化列表. 相当于直接进行初始化
使用初始化列表
Big(Big &a):v(a.v),b(a.b){}
注意初始化的顺序,与类内出现的顺序一致, 最后调用整个类的构造函数
构析顺序相反.
9. 友元
友元函数和友元类
friend 开头
class A{
friend void B::f();
}
class A{
friend class B;
}
10. this 指针
方便使用, 与c++转换为c代码有关
11. 常量对象, 常量成员函数, 常引用
常量对象只能使用常量成员函数