又多又难的C++类和对象知识点看这里了!!!!!
文章目录
- 1.先看看类是咋用的
- 2.访问限定符
- 3.类中的声明和定义分离
- 4.类对象模型
- 4.1 空类的大小
- 4.2 成员访问
- 5.内存对齐
- 6.this指针
- 6.1 this在哪里?
- 6.2 (类对象及this指针)三道送命题
- 7.类的六个默认成员函数、构造函数
- 7.1构造函数语法
- 7.2构造函数特性
- 7.3 析构函数
- 7.4 拷贝构造函数
- 8.赋值运算符重载
- 8.1 运算符重载
- 8.2 赋值运算符重载
- 8.3 前置++和后置++重载
- 9.const成员
- 10.初始化列表
- 11.隐式类型转换及explicit关键字
- 11.1 知识点
- 11.2 易错题
- 12.static静态成员
- 13.友元
- 13.1 友元函数
- 13.2 友元类
- 14.内部类
- 15.匿名对象
1.先看看类是咋用的
2.访问限定符
访问限定符在类里面这么用,那些成员私有,那些成员公有我么你自己定
3.类中的声明和定义分离
4.类对象模型
4.1 空类的大小
首先,我们要知道空的类也是有大小的!!
4.2 成员访问
声明和定义:
成员与函数的存储:
5.内存对齐
其实和C的内存对齐一摸一样!
指定对齐数可以使用:#pragma pack()
6.this指针
Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函
数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?
C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
6.1 this在哪里?
6.2 (类对象及this指针)三道送命题
7.类的六个默认成员函数、构造函数
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
7.1构造函数语法
构造函数:
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任
务并不是开空间创建对象,而是初始化对象。
其特征如下:
- 函数名与类名相同。
- 无返回值。(不是void,是就没有!!)
- 对象实例化时编译器自动调用对应的构造函数。
- 构造函数可以重载。
下面这个图片应该更加清晰:
7.2构造函数特性
不传参就可以调用的构造函数,都可以叫默认构造函数:
1.默认生成的构造函数
2.全缺省构造函数
3.无参构造函数
7.3 析构函数
与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
简单说就是清理资源!!
- 析构函数名是在类名前加上字符 ~。
- 无参数无返回值类型。
- 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构 函数不能重载
- 对象生命周期结束时,C++编译系统系统自动调用析构函数.
总体顺序:
局部对象->局部静态->全局对象(每个对象也按照后定义的先析构)
7.4 拷贝构造函数
如果不适用传引用传参,使用传值传参会发生什么???
8.赋值运算符重载
8.1 运算符重载
8.2 赋值运算符重载
8.3 前置++和后置++重载
// ++d1
Date& operator++();
// 特殊处理:解决语法逻辑不自洽,自相矛盾的问题
// d1++
// 为了跟前置++区分,强行增加一个int形参,够成重载区分
Date operator++(int);
// ++d ->d.operator++()
Date& Date::operator++()
{
*this += 1;
return *this;
}
// d++ ->d.operator++(0)
Date Date::operator++(int)
{
Date tmp = *this;
*this += 1;
return tmp;
}
9.const成员
10.初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟
一个放在括号中的初始值或表达式。
注意:初始化列表初始化的顺序是声明的顺序!!!!!!!!!
1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
2. 类中包含以下成员,必须放在初始化列表位置进行初始化:
引用成员变量
const成员变量
自定义类型成员(且该类没有默认构造函数时)
11.隐式类型转换及explicit关键字
11.1 知识点
如果我们不想让隐式类型转换发生我们可以加上explicit关键字
对于多参数的隐式类型的转换:
11.2 易错题
12.static静态成员
上面是类里面就可以随便访问,但是如果在类外想访问该如何?
13.友元
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以
友元不宜多用。
13.1 友元函数
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在
类的内部声明,声明时需要加friend关键字。
13.2 友元类
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
14.内部类
也就是在一个类的里面定义另一个类!
15.匿名对象
怎么用及特点:
应用场景: