5.1 类的定义
第五章 类和对象(一)
类是面向对象程序设计的核心,它是一种新的数据类型,也是实现抽象类型的工具。类通过抽象数据类型的方法实现,将不同类型的数据和与这些数据相关的操作封装在一起。类是一种更高抽象层次的数据类型,而对象是类的实例;因此,类和对象是密切相关的。没有脱离对象的类,也没有不依赖于类的对象。类和对象的概念比较复杂,有关内容也比较多,本书分为两章讲述。这一章讲述有关类和对象的基本概念和基础知识,下一章讲述复杂的对象应用。
5.1.1 什么是类
类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。因此,类具有更高的抽象性,类中的数据具有隐藏性,类还具有封装性。
2024/6/25日补充
第一个问题出现了:类和结构体有什么区别?
结构体(struct)和类(class)是C语言和C++中的两种数据结构。尽管它们在一些方面类似,但它们有几个关键区别:
1. 数据封装和成员访问控制
-
结构体(struct):
- 在C语言中,结构体只包含数据成员,不能包含函数成员。
- C语言的结构体没有成员访问控制(public, private, protected)的概念,所有成员都是默认public的。
- 示例:
struct Person { char name[50]; int age; };
-
类(class):
- 在C++中,类不仅可以包含数据成员,还可以包含函数成员(方法)。
- 类支持成员访问控制,可以将成员声明为public, private或protected。
- 默认情况下,类的成员是private的。
- 示例:
class Person { public: char name[50]; int age; void display() { std::cout << "Name: " << name << ", Age: " << age << std::endl; } private: int id; // 这是一个私有成员,外部不能直接访问 };
2. 继承和多态
-
结构体(struct):
- 在C语言中,结构体不支持继承和多态。
- C++中,结构体可以支持继承和多态,但这是一个C++的扩展特性,而不是C语言的一部分。
- 示例(C++结构体支持继承):
struct Base { int x; }; struct Derived : public Base { int y; };
-
类(class):
- 类是面向对象编程的核心,支持继承和多态。
- 类可以通过继承来扩展已有类的功能,并且支持虚函数以实现多态。
- 示例:
class Base { public: virtual void show() { std::cout << "Base class" << std::endl; } }; class Derived : public Base { public: void show() override { std::cout << "Derived class" << std::endl; } };
3. 默认成员访问权限
- 结构体(struct):
- 在C语言中,结构体的所有成员默认是public的。
- 在C++中,结构体的成员也默认是public的。
- 类(class):
- 在C++中,类的成员默认是private的。
4. 使用上的语法和习惯
-
结构体(struct):
-
在C语言中,使用结构体时需要显式地使用
struct
关键字。 -
在C++中,可以省略
struct
关键字,只使用结构体名。 -
示例(C语言):
struct Person p;
-
示例(C++):
Person p; // 不需要struct关键字
-
-
类(class):
- 在C++中,使用类时不需要任何额外的关键字。
- 示例:
Person p;
5. 内存管理
-
结构体(struct):
- 在C语言中,结构体实例化后,内存的分配和释放完全由程序员管理。
-
类(class):
- C++中的类可以有构造函数和析构函数,用于在对象创建和销毁时自动管理资源和内存。
总结
虽然结构体和类在C++中可以有一些重叠,但它们的本质和功能在C语言和C++中存在显著差异。类是面向对象编程的核心,提供了数据封装、继承、多态等高级特性,而结构体主要用于简单的数据聚合。在使用时,根据具体需求选择适合的数据结构是关键。
类是一种用户定义的类型,它实际上是一种类型的实现。类使得应用中的实体(抽象的对象)在程序中可以直接被表示为标识符,并可以对它进行引用和操作,从而使程序中的概念与应用中的概念更加一致和对应。这便是类这种抽象数据类型所起到的作用。
类的结构是用来确定一类对象的行为的,而这些行为是通过类的内部数据结构和相关的操作来确定的。这些行为是通过一种操作接口来描述的,使用者只关心接口的功能,对它是如何实现的并不感兴趣。这就是通过抽象数据类型实现的类所达到的一种效果。而操作接口又被称为这类对象向其他对象所提供的服务。
类是面向对象程序设计方法的核心。在面向对象程序设计中,程序模块是由类构成的,C++语言为了兼顾C语言的特性,其程序模块由类和函数构成。函数只是数据和语句的封装,用于完成某种功能;类是数据和函数的封装,用于实现对某个问题的处理。因此,类是更大的抽象和更高的集成。
类实际上是一种更复杂的类型,它与基本数据类型不同,与结构类型也不同,因为类这种特殊类型中包含了对数据操作的函数。
5.1.2 类的定义格式
类的定义格式一般分为说明部分和实现部分。说明部分用来说明该类中的成员,包括数据成员和成员函数。实现部分是一些不必关心的内部实现细节。
类的一般定义格式如下:
class 类名 {
public:
// 成员函数或数据成员的说明
private:
// 数据成员或成员函数的说明
};
// 各个成员函数的实现
其中,class
是定义类的关键字。类名
是一种标识符,通常用大写字母开头的字符串作为类名,以示与对象变量名区别。一对花括号内是类的说明部分,包括前面的类头,说明该类的成员。类的成员包括数据成员和成员函数两部分。从访问权限上分,类的成员分为公有的(public
)、私有的(private
)和保护的(protected
)。这里,先讨论前两类,保护的成员在继承性一章中讨论。公有的成员用public
来说明,公有部分往往是一些操作(即成员函数),它是提供给用户的接口功能。这部分成员可以在程序中引用。私有的成员用private
来说明,私有部分通常是一些数据成员。这些成员是用来描述该类中的对象的属性,用户是无法访问它们的,只有成员函数或经特殊说明的函数才可以引用它们,它们是被用来隐藏的部分。
关键字public
、private
和protected
被称为访问权限修饰符或访问控制修饰符。它们在类体内出现的先后顺序无关,并且允许多次出现,用它们来说明成员的访问权限。
各个成员函数的实现是类定义中的实现部分,这部分包括所有在类体内说明的成员函数的具体实现。如果一个成员函数在类体内定义了,则实现部分将不出现在类体中;如果所有说明的成员函数都在类体内定义了,则实现部分可以省略。
下面是一个关于日期的类的定义,该类是对日期的抽象,该类的对象是具体的日期。
class TDate {
public:
void SetDate(int y, int m, int d);
int IsLeapYear();
void Print();
private:
int year, month, day;
};
日期类的实现部分
void TDate::SetDate(int y, int m, int d) {
year = y;
month = m;
day = d;
}
int TDate::IsLeapYear() {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
void TDate::Print() {
std::cout << year << "." << month << "." << day << std::endl;
}
在说明部分中,class
是关键字,TDate
是类名。大写字母开头的标识符用来表示类名。类体内是该类的成员说明,包括三个公有成员函数和三个私有数据成员。SetDate
函数用来设置日期,IsLeapYear
函数用来判断是否是闰年,Print
函数用来输出年、月、日的值。私有成员包括年、月、日三个整型变量。
5.1.3 注意事项
定义类时需要注意以下几点:
-
类体中不允许对数据成员进行初始化。例如,下面的定义是错误的:
class TDate { public: //... private: int year = 1998, month = 4, day = 9; // 错误 };
-
类的成员可以是基本数据类型、结构类型、类类型等。类的对象可以作为该类的成员,但自身对象的指针和引用是可以的。例如:
class M; class N { public: void f(M m); }; class M { private: N n; // N类的对象 };
-
公有成员先于私有成员声明。公有部分是用户关心的,私有部分是用户不感兴趣的。在说明数据成员时,一般按数据成员的类型大小,由小至大进行说明,以提高时空利用率。
-
将类定义的说明部分放到一个头文件中。例如,可以将前面的
TDate
类放到一个名为tdate.h
的头文件中,后面引用时比较方便。
总结
类是面向对象程序设计的核心,通过封装数据和操作实现更高的抽象。类的定义包括说明部分和实现部分,说明部分描述类的成员,实施部分提供成员函数的具体实现。定义类时需要注意成员的初始化、访问权限和数据成员的排列顺序等。
希望这篇博客能帮助您更好地理解C++中类的定义和使用。如果有任何问题或需要进一步的解释,请随时留言!