类的三种成员:
private数据只能在类内访问;
protected可在类内以及子类/派生类中访问,类外不可访问;
public:可在类外访问;
类的特性:
定义类时,系统不为其分配内存空间;
必须定义一个对象或者new一个对象;
才为其分配空间;
当一个类定义一个对象时,每个对象内部都存储各自的成员变量,但是对象内部不存储成员函数,
成员函数存储在代码区,由各对象共享成员函数。
this指针:
当对象调用成员函数时,函数可能会处理类的成员数据,此时,函数通过调用对象
内部的 this 指针来调用成员数据。
this指针是一个指向每个对象自身数据成员的指针,只有这样,调用函数时,才可以调 用各个对象内部的成员数据。
构造和析构:
虚析构:当存在多态时(虚继承),多态为父类指针指向子类对象,
虚析构可以保证调用派生类(子类)的析构函数,防止内存泄露;
析构函数分为:默认构造函数,有参构造函数,拷贝构造函数。
有参构造函数可以重载,
拷贝构造函数:
拷贝构造函数调用时机:旧对象初始化新对象;
如果用户不提供拷贝构造,会自动提供默认拷贝构造。
拷贝构造函数的几种形式:
浅拷贝:
Data(const Data &ob)
{
//ob为旧对象的引用
this->mA = ob.mA;
}
深拷贝:
Data(const Data &ob)
{
//ob为旧对象的引用
this->name = new char[strlen(ob.name)+1];
strcpy(name,ob.name);
}
构造函数的调用顺序:
先调用基类构造函数,后调用派生类(子类)构造函数;
先调用成员对象类构造函数,后调用基类构造函数;
派生类(子类)构造函数最后被调用;
总体顺序:成员对象类构造函数,基类构造函数,子类/派生类构造函数;
析构函数调用顺序:
先调用派生类/子类的析构函数,后调用基类的析构函数;
先调用基类的析构函数,后调用成员对象类析构函数
成员对象类析构函数最后被调用;
总体顺序:子类/派生类析构函数,基类析构函数,成员对象类析构函数;
静态成员:
概念:类的静态数据成员是为类的所有对象共享的数据成员,
静态数据成员可以实现多个对象之间的数据共享;
特点:1,类的静态数据成员在类内定义,在类外初始化。
2,无论是否定义对象,类的静态数据都会在程序加载时生成,不必定义对象;
3,类的静态数据成员可以被普通函数调用,静态函数只能调用静态成员;
class Data
{
public:
int a;
static int b; //类中定义
}
int Data::b = 100; //类中定义,类外初始化;
静态成员数据可通过类名直接访问:
cout<<Data::b<<endl;
静态成员数据也可通过对象直接访问
Data ob1;
cout<<ob1.b<<endl;
静态成员函数的特点:
1,静态成员函数无法访问类的非静态成员数据
2,静态成员函数无this指针
3,静态成员函数可在无对象定义时被调用;