三大特性——封装、继承、多态
1.封装
在类中,通常把属性和行为放在不同的控制权限下,加以控制
访问权限:
——public
类内部可以访问,类外部可以访问
——protected
类内部可以访问,类外部不可以访问
——private
类内部可以访问,类外部不可以访问
ps. protected和private的区别在于继承:子类可访问父类protected的属性
子类不可访问父类private的属性
1.1struct和class的区别
struct中默认访问权限为public
class中默认权限为private
1.2对象的初始化和清理
初始化和清理是必须要做的事
1.2.1构造函数
创建对象时为成员变量赋值,由编译器自动调用,无需手动调用
——分类及调用:
——拷贝函数调用时机
即在进行值传递或者返回局部对象时候,都是通过调用拷贝构造函数,拷贝一个和原对象相同值的对象,再进行传递。(这也解释了为什么值传递中形参不能改变实参,因为二者不是同一个对象)
——构造函数的调用规则
1.2.2析构函数
在对象销毁前系统自动调用,执行清理工作
注意:
如果我们不提供构造和析构,则编译器会提供编译器自带的构造和析构函数,但其自带的函数为空实现
1.2.3深拷贝与浅拷贝
浅拷贝存在的问题:
运行上述代码时候,会出现问题,原因为:当test运行完时,其中存放在栈区的变量p和p1都会被释放,此时由于采用的浅拷贝(编译器提供的拷贝构造函数为浅拷贝),所以p和p1中的m_height均指向同一块地址,所以在调用析构函数时,会导致重复释放,因此报错。
具体原理展示如下:
如何解决?
自己提供拷贝构造函数:
所以,如果有在堆区开辟空间的属性,则一定要自己提供拷贝构造函数,防止浅拷贝带来的问题。
1.2.4初始化列表
语法如下:
其中m_height(new int ( height ))相当于 int* m_height=new int(height)
1.2.5其他类对象作为本类成员
构造时:先构造类对象,再构造自身
析构时:先析构自身,再析构类对象
1.2.6静态成员
——静态成员变量
所有类的对象共享一份数据;
类内声明,类外初始化;
在编译阶段分配内存。
——静态成员函数
静态成员函数只可以访问静态成员变量;
所有类的对象共享一个函数
访问方法:
——通过对象访问
——通过类直接访问
1.3 c++对象模型和this指针
1.3.1 成员变量和成员函数分开存储
即静态成员变量、静态成员函数、非静态成员函数均只会有一份实例
1.3.2 this指针
ps:
1.其中this为指向调用add函数的对象的指针,*this指的就是该对象本体。
2.当返回值类型为Person时,此时编译器会调用拷贝构造函数,创造一个和原对象本体的值均相等的新对象,最终会返回这个新的对象;而返回值类型为Person&时候,最终会返回对象本体。
1.3.3空指针访问成员函数
空指针p可以访问work1、work2函数,且当加入了判断语句,就可以防止程序崩溃
1.3.4const修饰成员函数
1.4友元
——全局函数做友元
——类做友元
——成员函数做友元
1.5运算符重载
——加号运算符重载:
实现自定义数据类型的运算
此处仅仅展示了成员函数重载,也可以通过全局函数重载
——左移符号重载
只可以使用全局函数重载
——递增运算符重载
1.后置递增
2.前置递增:
——赋值运算符重载
编译器默认提供的赋值运算符只能进行浅拷贝,当类中有属性在堆区开辟空间存储,则此时做赋值操作会出现深浅拷贝问题。
所以需要重载赋值运算符
——关系运算符重载(==)
即让两个自定义对象进行对比操作
——函数调用运算符重载
即重载小括号,也被称为