1.1构造函数 :一个特殊的函数与类型名相同, 没有返回值类型, 保证创建一个对象时,自动调用一次,一个类可以有多个构造函数
作用:初始化对象
如果一个类不提供构造函数,则系统自动提供一个无参构造函数, 但一旦提供构造函数,则系统的无参构造自动消失。
1.2一个对象的创建过程
根据对象大小,分配内存, 如果类的成员变量是基本类型,则什么都不做; 如果是类类型的成员,则去构造它, 调用这个类的构造函数
1.3初始化参数列表
当类型中有const成员,或者引用类型的成员, 需要在构造函数调用之前赋值, 在构造函数参数列表之后,实现体之前的位置是初始化参数列表
注:构造函数可以直接赋值:
class A{
const int a;
int b;
int &c;
public:
A(int oc):a(123),b(99),c(*new int(oc)){
//a = 100;
//b = 200;
cout<<a<<","<<b<<","<<c<<endl;
}
};
int main()
{
A a(111);
}
【析构函数】
2.1析构函数:一个特殊的函数,和类名相同,但是函数名之前有一个~,不能有任何的参数,也没有返回值类型,在对象被销毁前自动调用一次
2.2什么时候需要自定义析构函数
对象销毁时,需要释放资源,一般是有动态内存分配时
2.3在构造函数中或者初始化参数列表中为指针类的成员变量分配了内存,在析构函数中释放掉动态分配的内存
2.4构造函数和析构函数的调用顺序:先构造后析构
【拷贝构造函数】
拷贝构造函数:是一个特殊的构造函数,是使用一个已经存在的对象,去创建另外一个同类型的对象
类名(const 类名& 新参名)
class A{
public:
A(){ ...
}
A(const A& a){
}
};
3.2拷贝构造函数调用的时机
使用同类型的对象,去创建另外一个对象
A a;
A b=a;
把一个对象赋值给函数的形参
showa(A a)
把一个对象作为函数的返回值
A geta(A a){
return a;
}
3.3什么时候需要自定义拷贝构造函数
希望自定义拷贝过程,需要让对象 有自己的独立空间,默认的拷贝构造函数 是把原对象的数据进行逐字节的拷贝
【静态成员函数】和【静态成员变量】
4.1 静态成员函数是不需要对象就可以直接调用的成员函数
4.2 静态受类名作用域和权限的控制
4.3 静态成员函数只能访问静态成员,不能直接访问非静态成员
4.4 静态成员变量必须在类外进行初始化,如果静态成员是基本类型,则初始化为0,如果是自定义类型,则自动调用无参构造
class A{
static int a;
};
静态成员变量的类型 类名::变量名;
4.5 静态成员函数无this指针,普通成员函数中,编译器负责传入一个指针this,而静态函数不需要通过对象调用,也就没有传入this指针