什么是类
- 类是一种抽象的概念,它是对一类具有相同特征和行为的事物的描述。一个类可以包含属性(数据)和方法(功能)。对象是类的实例,它是具体的、实际存在的事物。
- 举个例子,我们可以定义一个 "动物" 类,它有属性(如 "名称"、"年龄")和方法(如 "叫声"、"行动")。而 "猫"、"狗" 以及 "鸟" 等都是 "动物" 类的对象,它们共享相同的属性和方法,但具体内容有所不同。
- 在编程中,类和对象是面向对象编程(OOP)的基本概念。类定义了一个模板,它包含有关对象的描述和方法,而对象则根据类的描述创建实例。在使用类和对象时,我们可以将代码分为不同的模块,使程序更易于维护和扩展。
简而言之,掌握好类对理解好C++至关重要
类的引入
类- -共同属性的集合,是从C到C++要学的一个重要知识点,浅浅用C写个类
struct show
{ //类的成员函数
void print()
{
cout << "这是c写的类" << endl;
}
//类的成员
char author;
char reader;
};
如你所见,这个好想跟C语言的结构体非常相似,但是有一点非常不一样的就是,在C++的类中可以定义函数,这个函数叫做成员函数,在类中的变量成为成员变量。之所以这么相似,是因为C++要兼容C。
另外在C++中,较为倾向于用class替代struct。
延申- - - - class跟struct的区别?
答:class跟struct一个主要区别就是,class定义的类默认访问权限是private,struct默认访问权限是public
类的定义
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
class:定义类的关键字
className:类的名字
类体:成员变量+成员函数
类的定义方式
class Person {
public:
string name; // 姓名
int age; // 年龄
void sayHello() { // 说“你好”
cout << "Hello, I'm " << name << ", " << age << " years old." << endl;
}
Person(string name, int age) { // 构造函数
this->name = name;
this->age = age;
}
~Person() { // 析构函数
cout << name << " is destroyed." << endl;
}
};
类的一个定义方式就是,成员变量跟成员函数全部在类中实现。
另一个就是类的成员函数声明跟定义分离。
class Person {
public:
string name; // 姓名
int age; // 年龄
void sayHello() ;
Person(string name, int age);
~Person();
};
其它源文件:
void Person::sayHello()
{ // 说“你好”
cout << "Hello, I'm " << name << ", " << age << " years old." << endl;
}
Persong::Person(string name, int age) { // 构造函数
this->name = name;
this->age = age;
}
Persong::~Person() { // 析构函数
cout << name << " is destroyed." << endl;
}
简单来说呢,就是定义成员函数的时候需要加上类名
类的访问限定符以及封装
访问限定符
在面向对象编程中,类的访问限定符指的是在类中定义的成员变量和成员函数的访问权限控制。主要有三种访问限定符:
-
public:公共的,可以在类的内部和外部访问,是类的默认访问限定符。
-
private:私有的,只能在类的内部访问,外部无法访问。
-
protected:受保护的,可以在类的内部和派生类中访问,外部无法访问。
访问限定符的作用是确保程序的安全性和可靠性,并提高代码的可重用性和可维护性。通过对类的成员变量和成员函数进行访问控制,可以防止不合法的访问和操作,避免数据被误用或破坏。同时,也能够隐藏类的实现细节,使程序变得更加安全和可靠。
封装
封装:数据和操作数据的方法有机结合,隐藏对象属性和实现细节,只有一些简易的接口让用户跟对象进行交互。
就比如一台电脑,想要开机只需要按一下开机键就行了,不需要人为操作显卡、cpu、硬盘等等才能实现开机,一是能起到保护作用,二是让用户使用成本降低。
类的作用域
类定义了一个新的作用域,类的所有成员都在类里面,如果想在外部定义类,必须要表明类名
就像之前分离定义成员函数一样
这里顺带讲讲类的实例化,我们定义了一个类,就是告知编译器这个类有什么有什么,但是并没有开辟任何空间,也就是没有创建类变量,只是有这个模板。类的实例化就是定义类变量。比如上面写了一个Person类
Person p1;
用类创建一个p1类变量就是类的实例化。
那么问题来了如何计算类的大小?
规则如下:
1. 跟结构体对齐规则一致(具体可搜索C语言结构体对齐)
2.成员函数存放在公共代码段,不在类里
3.如果是一个空类或者只有成员函数,类只有1个字节用来占位
this指针
- this 指针是一个特殊的指针,它指向当前对象的实例。
- this 实际上是成员函数的一个形参,在调用成员函数时将对象的地址作为实参传递给 this。不过 this 这个形参是隐式的,它并不出现在代码中,而是在编译阶段由编译器默默地将它添加到参数列表中。
- this 作为隐式形参,本质上是成员函数的局部变量,所以只能用在成员函数的内部,并且只有在通过对象调用成员函数时才给 this 赋值
- 成员函数最终被编译成与对象无关的普通函数,除了成员变量,会丢失所有信息,所以编译时要在成员函数中添加一个额外的参数,把当前对象的首地址传入,以此来关联成员函数和成员变量。这个额外的参数,实际上就是 this,它是成员函数和成员变量关联的桥梁。
通俗来说就是,你定义了一个Person(类) p1;
p1内部有成员函数,当你在调用成员函数的时候,会自动有一个this指针(参数)作为函数的形参,是真的有一个形参,而this指针存放了p1的地址。
比如p1是不是有一个sayHello()函数,没有参数对吧,但你实际调用的时候,在编译看来他是这个样子
sayHello(Person* this);
即使你真的没有传参,但这是编译器偷偷帮你干的事情。