类和对象(1)
一、类的定义
- 在C++中,我们使用class关键字来定义类,className为类的名称,
*{}*中为类体,
需要注意类定义结束后面有一个分号!
class className
{
/*类体中可以定义两种内容
1)成员变量
2)成员函数*/
};
- 当类体有很多时,习惯上采用也函数类似的声明与定义方法,声明放在.h文件中,定义放在.cpp文件中。
二、类的访问限定符与封装
1.访问限定符
class中有三种访问限定符,他们分别是
public(公有) ,
protected(保护),
private(私有)。
注意
- 访问权限作用域是从该访问限定符开始,一直到下一个访问限定符出现为止。(这点很重要!)
- class的默认访问权限为private,而struct为public。
2.封装
小知识:面向对象的三大特性:封装,继承和多态。
我们这里只介绍封装。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。 (与用C语言实现许多数据结构的方法类似)
举个栗子:
class Stack
{
public:
void Push(int x);
void Pop();
private:
int* a;
int _size;
int _capacity
}
代码中就是通过公有的函数接口来对数据进行操作,可以防止数据被恶意更改。
三、类的作用域
在类体外定义成员,就需要使用我们之前说过的作用域解析符 ::。
四、类对象规则
1.类的实例化
简单来说,就是用类 类型创建出对象的过程,如:
Stack s1;
2.类对象的大小
那么类的大小该如何计算呢?
结论:类的对象中,只存储成员变量,不存储成员函数。 在计算时,计算成员变量之和,并且考虑内存对其规则即可。
补充:结构体内存对齐规则
- 第一个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8。 - 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是
所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
五、this指针
写到这儿,我们来正儿八经的定义一个类
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1,d2;
d1.Init(2024,5,13);
d2.Init(2024,5,14);
return 0;
}
问题:当d1调用Init函数时,函数是如何知道应该设置d1对象还是d2对象呢?
结论:C++在编译时会加上一个this指针,在函数体中所有成员变量的操作都是通过this指针实现的!
void Init(int year, int month, int day)
//void Init(Date* this,int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
实际上,this指针是成员函数的形参,存储在栈上。
写在最后,感谢你的阅读!