类的定义
类就是给一个=int之类的,不过自带一些方法
格式
class 名字
{
//里面都是方法还有变量
};
特点
正常情况下变量都是会加一特殊标识
定义在类⾯的成员函数默认为inline
C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。
typedef之类的都可以继续使用,挺好用的,当然cpp里面直接用名字就可以
访问限定符
⼀种实现封装的⽅式,就是给予权限
public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访 问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。
class定义成员没有被访问限定符修饰时默认为private,struct默认为public。
类域
#include<iostream>
using namespace std;
class Stack
{
public:
// 成员函数
void Init(int n = 4);
8private:
// 成员变量
int* array;
size_t capacity;
size_t top;
};
// 声明和定义分离,需要指定类域
void Stack::Init(int n)
{
array = (int*)malloc(sizeof(int) * n);
if (nullptr == array)
{
perror("malloc申请空间失败");
return;
}
capacity = n;
top = 0;
}
int main()
{
Stack st;
st.Init();
return 0;
}
类域影响的是编译的查找规则,程序中Init如果不指定类域Stack,那么编译器就把Init当成全 局函数
类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤::作 ⽤域操作符指明成员属于哪个类域。
对象=实例化
类就是给一个=int之类的,不过自带一些方法,而对象的实例化就是给出一个变量
变量自己储存,
内存对⻬规则
没有成员变量时需要有一个字节证明存在
this指针
原因:Date类中有Init与Print两个成员函数,函数体中没有关于不同对象的区分,那当d1调⽤Init和 Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?用于确定是哪一个
编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this 指针。
有const默认修饰
C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显 ⽰使⽤this指针
this指针储存在
首先先是不在对象里面,因为算内存时候就不会算,同时const是常变量,本质还是变量
栈:函数
堆:开辟内存,动态开辟
静态区:静态变量,全局变量
常量区域:常量
所以是栈,本质是一个形参,有些编译器是寄存器储存this
类的默认成员函数
⾯向对象三⼤特性
封装、继承、多态,下⾯的对⽐我们可以初步了解⼀下封装。
通过下⾯两份代码对⽐,我们发现C++实现Stack形态上还是发⽣了挺多的变化,底层和逻辑上没啥变 化。
• C++中数据和函数都放到了类⾥⾯,通过访问限定符进⾏了限制,不能再随意通过对象直接修改数 据,这是C++封装的⼀种体现,这个是最重要的变化。这⾥的封装的本质是⼀种更严格规范的管 理,避免出现乱访问修改的问题。当然封装不仅仅是这样的,我们后⾯还需要不断的去学习
。 • C++中有⼀些相对⽅便的语法,⽐如Init给的缺省参数会⽅便很多,成员函数每次不需要传对象地 址,因为this指针隐含的传递了,⽅便了很多,使⽤类型不再需要typedef⽤类名就很⽅便 •
在我们这个C++⼊⻔阶段实现的Stack看起来变了很多,但是实质上变化不⼤。