欢迎来到Cefler的博客😁
🕌博客主页:那个传说中的man的主页
🏠个人专栏:题目解析
🌎推荐文章:题目大解析2
目录
- 👉🏻面向过程和面向对象
- 👉🏻类的引入
- 👉🏻类的定义
- 类的两种定义
- 类的变量声明规则
- 👉🏻类的访问限定符
- 类的大小以及类中的函数在内存中的位置
👉🏻面向过程和面向对象
我们用洗衣机洗个衣服,存在着3个对象:人、衣服、洗衣机。
在c语言当中,我们会注重过程,人是怎么将衣服放入洗衣机的,洗衣机的内部是如何操作运行的。
C++是基于面向对象的,关注的是对象
👉🏻类的引入
在c语言中,结构体中只能定义变量,但是在c++中,结构体不但可以定义变量,还可以定义函数
struct Stack
{
void Init()
{
a = NULL;
top = capacity = 0;
}
int* a;
int top;
int capacity;
};
int main()
{
Stack s1;//c++中可以忽略struct
s1.Init();
return 0;
}
👉🏻类的定义
语法
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
类中的变量叫做类的属性或成员变量;类中的函数叫做类的方法或成员函数;类中的内容称为类的成员
类的两种定义
☂️1.类的声明和定义全部都在类体中进行
若函数的定义也在类体中进行,编译器可能会将其当作内联函数处理
☂️2.类的声明和定义分开
若类的声明在.h文件中进行,类的函数定义在.cpp文件中进行,成员函数前需加上
类名::
类的变量声明规则
一般声明类的变量我们会在变量前/后加上_,m;
原因是为了说明其局部性。
class Date
{
void Init(int year, int month, int day)
{
year = year;
}
int year;
int month;
int day;
};
如上述代码,编译器并不会报错,但这里问题出在函数的参数和类的成员变量的命名起冲突了,而一般在类中会先搜索类内的局部变量,所以这里是类中的year自己赋值给本身,并无意义。
所以我们才出现了这一套的命名规则。
👉🏻类的访问限定符
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 如果后面没有访问限定符,作用域就到 } 即类结束。
- class的默认访问权限为private,struct为public(因为struct要兼容C)
类的大小以及类中的函数在内存中的位置
class Date
{
void Init(int year, int month, int day)
{
year = year;
}
int year;
int month;
int day;
};
int main()
{
Date d1;
cout << sizeof(Date) << endl;
cout << sizeof(d1) << endl;
return 0;
}
上述代码中,结果是多少呢?
如果只看类中的成员变量,我们知道有3个int,所以是12个字节。
但是函数在类中占不占空间呢?
我们先看下结果 👇🏻 👇🏻
由此观之,函数在类中是不占空间的。
事实上,类中的方法即函数共用内存的中的一块区域。
可以这样理解,当我们实例化多个类的对象时,类的对象就是一个房子,房子中有浴室、卧室、厨房,而每个对象的成员变量就是相当这些浴室、卧室、厨房。
所以成员变量是相对独立的,每实例化一个对象,都要在内存中开辟空间。
但是函数不一样,函数相当于小区里的篮球场,便利店,是共有的。
它既属于每个对象,又不单单只属于某个对象。所以它只是在内存中占用一个区域。