1.对象初始化列表
// 一个类B中 有另一个类A的对象,A中没有无参构造
// 不能直接定义A的对象,需要某种机制对A的对象进行初始化
// ===> 对象初始化列表:用来对对象进行初始化
// 构造函数后面加 :后面是要初始化的对象
// 不能直接定义A的对象,需要某种机制对A的对象进行初始化
// ===> 对象初始化列表:用来对对象进行初始化
// 构造函数后面加 :后面是要初始化的对象
// 1、对象初始化列表比当前对象的构造函数先执行
// 2、对象在对象初始化列表中的顺序和构造顺序无关,和在类中的声明顺序有关
// 2、对象在对象初始化列表中的顺序和构造顺序无关,和在类中的声明顺序有关
// const常量也要放到对象初始化列表中进行初始化
// 构造函数的调用顺序和析构函数的调用顺序相反
2.动态创建对象和释放
// malloc 和 free:是C语言的库函数,不是语法的一部分
// new 和 delete:是C++的运算符 =====> 因为是运算符,效率比malloc和free要高
// new 和 delete:是C++的运算符 =====> 因为是运算符,效率比malloc和free要高
// new 和 delete
// 开辟空间:new 数据类型
// 开辟空间:new 数据类型
int *p2 = new int;
*p2 = 10;
cout << *p2 << endl;
*p2 = 10;
cout << *p2 << endl;
// 释放
delete p2;
delete p2;
// new 在创建变量的时候可以对变量进行初始化
int *p3 = new int(20);
cout << *p3 << endl;
delete p3;
int *p3 = new int(20);
cout << *p3 << endl;
delete p3;
// new 创建数组
// new 数据类型[大小], 创建数组的时候不能初始化
int *p2 = new int[10];
for (int i = 0; i < 10; i++)
p2[i] = i;
for (int i = 0; i < 10; i++)
cout << p2[i] << " ";
cout << endl;
// new 数据类型[大小], 创建数组的时候不能初始化
int *p2 = new int[10];
for (int i = 0; i < 10; i++)
p2[i] = i;
for (int i = 0; i < 10; i++)
cout << p2[i] << " ";
cout << endl;
// 释放:delete 需要注意的是,释放的时候一定要 加上[],不然会导致内存泄露
delete[] p2;
delete[] p2;
// 对象的动态创建
void func3()
{
// new 创建对象的时候会自动调用构造函数对对象进行初始化
A *pa = new A(10);
void func3()
{
// new 创建对象的时候会自动调用构造函数对对象进行初始化
A *pa = new A(10);
// delete 析构对象的时候,会自动析构函数回收对象资源
delete pa;
}
delete pa;
}
3.静态成员变量和静态成员函数
// 静态成员函数只能使用静态成员变量
static void show()
{
// printf ("id = %d, name = %s\n", _id, _name);
printf ("num = %d\n", num);
}
static void show()
{
// printf ("id = %d, name = %s\n", _id, _name);
printf ("num = %d\n", num);
}
// 静态成员变量不是对象的属性,是类的属性,不属于单个对象
// 而是所有对象所共享的一个变量
// 静态成员变量必须在类的外部进行初始化
static int num;
// 而是所有对象所共享的一个变量
// 静态成员变量必须在类的外部进行初始化
static int num;
// 静态成员变量必须在类的外部进行初始化
int Student::num = 10;
int Student::num = 10;
// 静态成员使用:
// 1、通过对象来使用
s1.num = 123;
cout << s2.num << endl;
// 1、通过对象来使用
s1.num = 123;
cout << s2.num << endl;
// 2、通过类名来使用
Student::num = 456;
cout << s3.num << endl;
Student::num = 456;
cout << s3.num << endl;
// 静态成员函数
s3.show();
Student::show();
s3.show();
Student::show();
4.对象的内存模型
// 类的普通成员函数,内部都有一个隐藏的指向当前对象的指针
// ======> this
Test(int a, int b) // Test(Test *const this, int a, int b)
void show() // void show(Test *const this)
static void show1() // static void show1()
void show2() const // void show(const Test *const this)