类和对象——对象特性
构造函数和析构函数
构造函数 语法:类名(){}
- 构造函数,没有返回值也不写void
- 函数名称与类名相同
- 构造函数可以有参数,因此可以发生重载
- 程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次
析构函数 语法:~类名(){}
- 析构函数,没有返回值也不写void
- 函数名称与类名相同,在名称前加上符号 ~
- 析构函数不可以有参数,因此不可以发生重载
- 程序在对象销毁前自动调用析构,无需手动调用,而且只会调用一次
构造函数的分类及调用
两种构造方式
按参数分为:有参构造和无参构造
按类型分为:普通构造和拷贝构造
三种调用方式
括号法(主要)
调用默认构造函数时候,不要加()
因为编译器会认为这是一个函数的声明
显示法
不要利用拷贝构造函数 初始化匿名对象,编译器会认为Person(p3) === Person p3;
隐式转换法
Person p4 = 10;
Person p5 = p4;
拷贝构造函数的调用时机
- 使用一个已经创建完毕的对象来初始化一个新对象
- 值传递的方式给函数参数传值
- 以值方式返回局部对象
构造函数的调用规则
- 创建一个类,C++编译器会给每个类都添加至少三个函数:
默认构造函数、析构函数、拷贝构造函数 - 如果我们写了有参构造函数,编译器就不再提供默认构造,依然提供拷贝构造
- 如果写了拷贝构造函数,编译器就不提供其他构造函数
静态成员
静态成员变量就是在成员变量和成员函数前加上关键字static,成为静态成员
静态成员变量
- 所有对象共享同一份数据
- 在编译阶段分配内存
- 类内声明,类外初始化
- 静态成员变量是有访问权限的,私有成员访问不到
- 有两种访问方式:通过对象和通过类名
Person :: p.m_A
静态成员函数
- 有两种访问方式:通过对象和通过类名
- 静态成员函数可以访问静态成员变量,静态成员函数不可以访问非静态成员变量
- 静态成员变量是有访问权限的,私有成员访问不到
对象模型和this指针
成员变量和成员函数分开存储
- 空对象占用内存空间为1,C++编译器会对每个空对象分配一个字节空间,是为了区分空对象占内存的位置
- 只要是空的就是1,但如果里面有一个int就是4
- 静态成员变量不属于类对象上
const修饰成员函数
常函数
- 成员函数后加const后我们称为这个函数为常函数
- 常函数内不可以修饰成员属性
- 成员属性声明时加关键字mutable后,在常函数中依然可以修改
//在成员函数后面加const,修饰的是this指针,让指针指向的值也不可以修改
void showPerson() const
{
this0>m_A=100;//报错
}
常对象
- 声明对象前加const称该对象为常对象
- 常对象只能调用常函数
- 成员属性声明时加关键字mutable后,在常函数中依然可以修改
void test()
{
const Person p;//常对象
p.m_A=100;//报错
}