目录
一、过程性编程和面向对象编程
二、类的定义
2.1类的定义语法
2.2类的定义方式
三、类的访问限定符
四、封装
五、类对象模型
5.1类的实例化
5.2类对象的存储方式
六、this指针
6.1什么是this指针
6.2 this指针的特性
一、过程性编程和面向对象编程
C语言是面向过程的,
关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,
关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
好比你要从CityA到CityB旅游,C语言是你自驾游,你要开车,上高速,加油,休息,下高速...一系列动作才能完成这趟旅程;而C++就是你买了一张机票,你只需要在意如何到机场以及如何登机,至于飞机怎么从A飞往B的过程你无需在意。
二、类的定义
2.1类的定义语法
class 为定义类的关键字, ClassName 为类的名字,{}中为类的主体,注意类定义结束时后面分
号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
2.2类的定义方式
1.声明和定义全部放在类体中。
2. 类声明放在.h文件中,成员函数定义放在.cpp文件中。
注意:1.成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
2.声明和定义分离时,成员函数名前需要加 [类名::]。
在以上两种类的设计中,我们更推荐第二种方法,类设计尽可能将公有接口与实现细节分开,这也是体现封装的一个例子。
三、类的访问限定符
在上述例子中,关键字private和public,它们描述了对类成员的访问控制,被称为访问限定符。
使用类对象的程序都可以直接访问共有部分(即public),我们一般在这里设置接口,通过接口来访问我们的私有部分(即private),private部分是不可以直接被访问的,防止程序直接访问数据被称为数据隐藏。
另外,类还存在另一个访问类别 protected,它与 private 相似,在类外只有用共有类成员来访问protected 部分中的类成员。 private 和 protected 之间的区别只有在基类派生的类中才会表现出来。派生类的成员可以直接访问基类的保护成员,但不能直接访问基类的私有成员。
对于外部世界来说,保护成员的行为和私有成员相似;但对于派生类来说,保护成员的行为与公有成员相似。
类和结构体
C++对结构体进行了扩展,使之具有与类相同的特性。它们之间唯一的区别是,结构体的默认访问类型是 public,而类为 private
四、封装
面向对象的三大特性:封装、继承、多态
在类和对象中,我们主要讨论的是封装性,就像我们在2.2中建议,类设计尽可能将公有接口与实现细节分开,这就是体现封装的一个例子。那么到底什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。
在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来
隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。
五、类对象模型
5.1类的实例化
用类类型创建对象的过程,称为类的实例化。
类是对对象进行描述的,是一个抽象的,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。而类实例化出的对象 占用实际的物理空间,存储类成员变量。
5.2类对象的存储方式
我们之前学习过结构体的内存对齐,那我们的计算机是如何存储类的呢?
一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐。
注意:空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。
六、this指针
6.1什么是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, 2, 28);
d2.Init(2024, 2, 28);
d1.Print();
d2.Print();
return 0;
}
6.2 this指针的特性
1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
2. 只能在“成员函数”的内部使用
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
递,不需要用户传递。