C++兼容C,C++把结构体升级成了类;
(1)类里面可以有数据,这个数据叫成员变量。
(2)类里面还可以定义函数。
(3)C语言 struct ListNode是类型,C++里面ListNode就是类型,不用在前面加上struct
这个就是在类里面定义函数
调用类里面的函数时就这样写
在C++中,更喜欢用Class来定义类
类的定义
定义的函数叫成员函数
定义的变量叫成员变量
类的名称就是类型,用类的类型去定义一个变量,C++里更喜欢将定义出来的的变量叫对象
假如把类的声明和定义分开写
这就是类的声明
这是类的定义
而且还要加上圈中的部分,这是告诉编译器Init是Stack这个类里面的函数,不是全局函数
类的访问限定符
C++的访问限定符有三种
分别是公有、保护和私有
一个类大部分情况下,成员变量是私有的,成员函数给别人用的就是共有的不给别人用的就是私有的
成员变量都会加个_避免与成员函数中的参数重名导致程序错误
类对象实例化
类里面定义的成员变量其实只是一种声明
只有在主函数里开空间了才算是定义,这个也叫类对象的实例化
这有道题
A1里面定义了一个int变量,所以它的大小就是4,但A2和A3什么都没定义,其实也占一个字节的空间,这一个字节其实用来占位的,标识对象存在过
this指针
在每次调用成员函数时编译器也会给这个函数里加一个this指针
调用的时候也会改,也是编译器偷偷改
在类里面其实也可以使用this,但是在实参和形参的部分不能加
因为this是个隐含的形参,所以他存在栈里面
构造函数
类和对象里面其实是有6个默认成员函数
一个类有多个构造函数,就证明他有多个初始化方式
以后在类里面直接构造一个初始化函数,当下次实例化的时候就会自动调用构造函数,这个还是函数重载,无参的不开空间,有参的开空间
这里明显能看到初始化了
像构造函数这种的函数如果我们不写系统就会默认生成,但是这次生成的值却是随机值
其实是C++会把类型分为内置类型和自定义类型
int/char/double和指针等等都是内置类型
用户自定义的类型就是自定义类型
默认生成的构造函数
1、内置类型成员不作处理
2、自定义类型的成员,会去调用他的默认构造(不用传参数的构造)
其实也可以在声明位置给缺省值,就会去用缺省值来初始化
析构函数
每次开完空间后都需要销毁,所以就有了析构函数,return 之前自动释放空间
这就是析构函数,程序解释后就会自动调用
先来写一个日期类
再将对象实例化,接着打印出来
或者直接将构造函数的参数改成全缺省
拷贝构造
就相当于实例化后的对象之间进行赋值,内置类型不用拷贝构造,自定义类型无论简单或复制都需要写一个拷贝构造
这里的意思就是实例化一个d2,然后将d1的值赋值给d2
还有这种写法
而且最好加个const,就会避免代码写反了的问题
练习——求当前日期的x天后的日期
可以先写一个求每一月天数的函数
然后写出求日期函数
默认生成拷贝构造和赋值重载:
对于内置类型,如果不写拷贝构造编译器会进行值拷贝(按字节一个一个拷贝)
对于自定义类型,不写拷贝构造则会调用这个成员的拷贝构造/赋值重载
对于类和对象来说,符合栈的结构——后定义的先析构
什么情况下需要实现拷贝构造?
自己实现了析构函数释放空间,就需要实现拷贝构造