目录
1.类的定义
C++中新引入了类和对象的概念,并以此为基础产生了构造函数,析构函数,运算符重载等一系列的新定义
class为定义类的关键字,Data为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或 者成员函数。
C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。
1.1访问限定符
1.1.1访问限定符作用
1.C++⼀种实现封装的方式,用类将对象的属性与方法结合在⼀块,让对象更加完善,通过访问权限 选择性的将其接⼝提供给外部的用户使用。
2.public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问
2.this指针
在定义类成员,并使用成员函数时,成员函数中隐含指向类成员的this指针,并一起传递过去
例如:void Init(Date* const this, int year, int month, int day)
this指针自动携带,不能写在括号内的实参中
3.构造函数
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并 不是开空间创建对象
3.1构造函数的特点
1.构造函数没有返回类型,构造函数的名字与类名相同
2.构造函数在定义成员时即可完成初始化
3.若没有明确写出构造函数,系统会生成无参的默认构造函数完成初始化,但如果用户有明确写出构造函数则不会生成默认构造函数
4.默认构造函数包括无参的构造函数和全缺省的构造函数,即不传参数的构造函数即为构造函数,传参的函数不是默认构造函数
5.系统的默认构造可以解决日期类的构造,但如果是需要开辟空间的构造就必须要有自己构造的构造函数
4.析构函数
析构函数与构造函数作用相反,析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧的, 函数结束栈帧销毁
4.1析构函数的特点
1. 析构函数名是在类名前加上字符~
2. 无参数无返回值。
3.析构函数无法重载,一个类中只需要一个析构函数,若为自己定义,则编译器会自动生成一个默认的析构函数
4.当定义的对象生命周期结束时,会自动调用析构函数
5.系统默认的析构函数可以生成日期类的构造函数,若需要释放空间则需要自己写析构函数释放空间
5.拷贝构造函数
如果⼀个构造函数的第⼀个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数 也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。
5.1拷贝构造函数的特点
1.当使用类类型进行传参时必须使用拷贝构造函数
2.拷贝构造函数的第⼀个参数必须是类类型对象的引用(否则在给拷贝构造函数传参时会无限次调用拷贝构造函数),使用传值方式编译器直接报错,因为语法逻 辑上会引发无穷递归调用。拷贝构造函数也可以多个参数,但是第⼀个参数必须是类类型对象的引用,后面的参数必须有缺省值
3.若没有明确定义拷贝构造函数,编译器会进行默认的拷贝构造函数,即浅拷贝,将数据一个字节一个字节的拷贝过去。若需要重新开辟空间存储同样的数就需要自己定义拷贝构造函数即深拷贝
6.运算符的重载
6.1运算符重载的特点
当运算符被用于类类型的对象时,C++语言允许我们通过运算符重载的形式指定新的含义。C++规 定类类型对象使⽤运算符时,必须转换成调用对应运算符重载,若没有对应的运算符重载,则会编 译报错
运算符重载是具有特殊名字的函数,他的名字是由operator和后面要定义的运算符共同构成。和其 他函数⼀样,它也具有其返回类型和参数列表以及函数体。
运算符重载具有特殊名字的函数,他的名字是由operator和后面要定义的运算符共同构成。和其他函数⼀样,它也具有其返回类型和参数列表以及函数体。
自定义的加减乘除运算符都需要自己定义。等于运算符可不定义,编译器默认的赋值运算符类似与拷贝构造函数的浅拷贝
7. 取地址运算符重载
7.1 const成员函数:
将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后面
const实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。 const修饰Data类的Print成员函数,operator==隐含的this指针由 Date* const this 变为 const Date* const this
添加const遵从原则“能加尽加”,若要改变this指针的值,就不在括号后添加const