在堆上实例化对象
假定有一个Person类
Person *p1 = new Person();
/*
1、申请内存
2、调用构造
此处为new和malloc的一个区别,malloc只申请内存,不调用构造函数
*/
- 在堆上实例化的对象不会自动调用析构函数,必须手动析构
delete p1;
/*
1、先调用析构函数
2、再释放内存
此处为delete和free的一个区别,free不调用析构函数
*/
- 堆上的对象被delete的时候生存周期才满
static
注意:static修饰的成员变量必须再类外进行初始化
class Person()
{
public:
Person()
{}
private:
~Person()
()
static int _num;
}
int Person::_num = 0;
- 静态的成员变量一个类只有一份,不占对象大小
- 静态的成员变量的访问不依赖于对象,可以依靠类名加作用域访问(Person::_num)
- 成员方法也可以写成静态的,静态的成员方法不依赖于对象,可以依靠类名加作用域+静态成员方法名访问
- 静态成员方法和静态成员变量的使用不依赖于this指针,所以静态的成员方法内部不允许使用普通的成员变量和普通的成员方法
- 普通成员方法中可以使用静态的成员方法和静态的成员变量
初始化列表
在进入构造函数之前,对成员进行初始化(进入构造函数之后叫做赋值,此时成员变量已经定义,就不是初始化了)
class Person
{
public:
Person(char *name, int age, bool sex)
:_sex(sex)//初始化列表
{
};
private:
char *_name;
int _age;
bool _sex;
}
- 常量和引用必须在初始化列表中进行初始化(因为其不可被赋值)
- 如果存在必须初始化的成员变量,则一定要将其放在初始化列表中进行初始化
const
- const加在成员方法的右括号后边,修饰this指针指向的对象
- 静态成员方法右括号后边不允许加const(因为其没有this指针)
- 成员对象在类对象构造之前进行构造,如果成员对象不存在默认的构造函数,就必须将其写在初始化列表里
- 对象的构造顺序:先构造成员对象,再构造类对象
- 对象的析构顺序:先析构类对象,后析构成员对象
友元
1、友元类
friend class Person;
//指明Person类可以访问本类私有的成员变量和私有成员方法
- 友元是单方面的
2、类与类之间的关系
(1)嵌套
- 如果在外界想要使用一个类中共有的嵌套类,需要指明作用域
- 类中私有的嵌套类不允许外部访问
(2)组合
3、友元函数
friend void Show(date &da);
//知名该函数为本类的友元函数,可以访问本类的私有成员