12.C++ 类的高级用法详解:封装、继承、多态与常用技巧

一、前言

如果你想要搞清楚类在编程语言中的作用,可以看一看另一篇文章:结构体、类、接口

本文重在介绍C++中类的各种使用方法。

二、基本使用

C++中声明一个类的关键字是class,其基本使用如下:

class Test {
public: //权限
	int a; //属性
	void fun() { //方法
	}
};
//使用:
Test t; //根据类定义一个对象
t.a=10; //给对象的属性a赋值
t.fun(); //调用对象中的fun函数

对于一些简单开发来说,只要有上面的这点知识点,其实就已经可以正常写代码了。

因为它满足了我们对类的基本要求:自定义组合属性与方法

虽然在C++中结构体与类已经基本相同了,但结构体最开始的作用仅仅是组合属性

但为了实现更多强大的功能,C++的类还提供了非常多的特性,满足类的三大基本要求:封装继承多态

三、封装

首先是封装,它对应的特性其实就是类中的权限控制。

比如下面这一段代码:

class Stu {
public:
	string id; //存放学生id,比如为六位数字,比如:100000
   //其它属性方法省略
};

int main() {
	Stu s;
	s.id = "1000"; //但如果直接赋值,不放6位也一样可以
}

相信大家应该也遇到过,一些卡号、手机号、身份证号都是有一定格式的,如果将其像结构体那样,直接暴露出来,就会出现问题。

因为我们无法控制赋值的格式,而只能被动的写注释去要求别人这样做,这显然是一种非常不安全的行为。

为了达到这样的目的,我们一般就会将其设置为私有的,并只能通过特定的函数对其进行赋值,然后我们就能在这个赋值函数中达到控制格式的目的:

class Stu {
private:
	string id; //存放学生id,比如为六位数字,比如:100000
public:
	bool set_id(const string& _id) {
		if (id.size()==6) { //省略字符判断
			id = _id;
			return true;
		}
		else {
			return false;
		}
	}
};

此时我们就用到了private关键字,只要放在这个关键字后面的属性方法,外界都是无法访问的,也就是私有的意思。

但我们可以通过在public关键字后面放开专门去设置这个属性的方法,比如这里的set_id函数,其作用就是设置它的属性id

但不同的地方来了,通过方法来设置对应的属性,我们就可以在这个方法中来控制这个过程了!

int main() {
	Stu s;
	//s.id = "1000"; //此时不允许直接赋值,编译器直接报错
	s.set_id("110011"); //只能通过公有函数间接赋值,达到控制的目的
}

如果传入不符合格式的id,就会直接赋值失败,从而达到了主动控制的目的。

这样的用法非常常见:属性本身私有化,然后专门为这个属性写两个公有函数,一个用来赋值、另一个用来获取

也正因为太过于常见了,所以常常还会有gettersetter函数的叫法,如下:

class Stu {
private:
	string id; //存放学生id,比如为六位数字,比如:100000
public:
	//setter函数
	bool set_id(const string& _id) {
作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux