C++深入探索类和对象之封装及class与struct的区别

 更新时间:2022年05月18日 10:19:46   作者:对象new不出来  
C++ 类与对象涉及的知识点非常广泛,所以我准备写成几个特定的部分来作为博文分享,这次的blog将详细讲解类的属性、行为、访问权限,class与struct的区别以及具体案例,希望能够对你们有帮助,解决入门小白或者对这方面了解不多的朋友们,那么接下来开始今天的内容

封装的意义

封装是C++三大面向对象之一

意义:

1、设计类的时候,属性和行为写在一起,表现事物

2、类在设计时,可以把属性和行为放在不同的权限下,加以控制

语法:class 类名 {访问权限:属性 / 行为};

示例1:设计一个直角三角形,并求解他的面积

#include<iostream>
using namespace std;
//class代表设计一个类,后面跟着的是类名
class taiAngle
{
public:  //访问权限  公共的权限
	//属性
    int m_a;//直角边a
    int m_b;//直角边b
	//行为
	//获取三角形面积
	double calculate()
	{
		return (m_a*m_b)/2;
	}
};
int main() {
 
	//通过三角形类,创建三角形的对象
	// c1就是一个具体的三角形
	taiAngle c1;
	c1.m_a = 10; //给三角形两边进行赋值操作
    c1.m_b = 10;
	cout << "三角形的面积为: " << c1.calculate() << endl;//调用方法
	system("pause");
	return 0;
}

示例2:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,显示学生的姓名和学号

//学生类
class Student {
public:
	void setName(string name) {
		m_name = name;
	}
	void setID(int id) {
		m_id = id;
	}
	void showStudent() {
		cout << "name:" << m_name << " ID:" << m_id << endl;
	}
private:
	string m_name;
	int m_id;
};
int main() {
	Student stu;
	stu.setName("马可波罗");
	stu.setID(250);
	stu.showStudent();
	system("pause");
	return 0;
}
 

在第二个案例中,姓名和学号是不会被直接访问的,主函数中我们创建了stu学生类对象,但是我们输入“stu."时不会出现m_name和m_id的提示,这就牵扯到了访问权限的知识点,处于私有权限的属性只能靠成员方法加以控制,继续往下看

访问权限

public 公共权限:

成员:类内可以访问,类外可以访问

任何一种继承,子类可以访问父类的公共成员

保护权限protected

成员:类内可以访问,类外不可以访问

任何一种继承,子类可以访问父类的保护成员

私有权限private

成员:类内可以访问,类外不可以访问。

任何一种继承,子类不可以访问父类的私有成员

示例:

class Person
{
	//姓名  公共权限
public:
	string m_Phone;
	//手机  保护权限
protected:
	string m_Phone;
	//银行卡密码  私有权限
private:
	int m_Password;
public:
	void display();
};
void Person::display()
{
	m_Name = "张三";
	m_Phone = "华为";
	m_Password = 123456;
}
int main() {
	Person p;
	p.m_Name = "李四";
	//p.m_Phone = "iPhone 13";  //保护权限类外访问不到
	//p.m_Password = 123;     //私有权限类外访问不到
	system("pause");
	return 0;
}

这个案例中定义了三种权限的属性,只有punlic:权限下的属性和成员函数可以在类外被调用;这里的display方法我在public:权限下只是声明的一下,然后在类外完成方法的实现,但是需要在原来声明的基础上加"Person::"在返回值类型和函数名之间,以表示是Person这个类作用域下的display方法;main函数只可以调用display方法和修改m_Name属性,因为只有这两个在punlic:权限下了。

class和struct的区别

在C++中 struct和class唯一的区别就在于默认的访问权限不同

class 默认权限是私有

struct 默认权限是公共

示例:

class C1
{
	int  m_A; //默认是私有权限
};
struct C2
{
	int m_A;  //默认是公共权限
};
int main() {
	C1 c1;
	c1.m_A = 10; //错误,访问权限是私有
	C2 c2;
	c2.m_A = 10; //正确,访问权限是公共
	system("pause");
	return 0;
}

class和struct中都定义了m_A属性,但是main函数中是无法修改类c1对象的m_A属性的

成员属性私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,我们可以检测数据的有效性

示例:

class Person {
public:
	//姓名设置可读可写
	void setName(string name) {
		m_Name = name;
	}
	string getName()
	{
		return m_Name;
	}
 
	//获取年龄 
	int getAge() {
		return m_Age;
	}
	//设置年龄
	void setAge(int age) {
		if (age < 0 || age > 150) {
			cout << "你个大乌龟!" << endl;
			return;
		}
		m_Age = age;
	}
	//情侣设置为只写
	void setLover(string lover) {
		m_Lover = lover;
	}
private:
	string m_Name; //可读可写  姓名
	int m_Age; //只读  年龄
	string m_Lover; //只写  爱人
};
int main() 
{
	Person p;
	//姓名设置
	p.setName("张三");
	cout << "姓名: " << p.getName() << endl;
	//年龄设置
	p.setAge(50);
	cout << "年龄: " << p.getAge() << endl;
	//爱人设置
	p.setLover("阿尼亚");
	//cout << "爱人: " << p.m_Lover << endl;  //只写属性,不可以读取
	system("pause");
	return 0;
}

当属性都设计成私有时,我们可以自己控制属性的读写权限,让程序更具有强壮性,通过写方法来读写属性,是不是很具有掌控性呢,接下来给出一个案例,加深理解。

案例练习

利用全局函数和成员方法两种方式判断两个立方体是否相等,要求利用类的知识,将属性设置为私有。

参考代码:

#include<iostream>
using namespace std;
//案例1 判断两个立方体是否相等
class Cube
{
public:
	void setL(int l)
	{
		m_L = l;
	}
	int getL()
	{
		return m_L;
	}
	void setW(int w)
	{
		m_W = w;
	}
	int getW()
	{
		return m_W;
	}
	void setH(int h)
	{
		m_H = h;
	}
	int getH()
	{
		return m_H;
	}
	int Area(int a, int b, int c)
	{
		return 2 * (a * b + a * c + b * c);
	}
	int 体积(int a, int b, int c)
	{
		return a * b * c;
	}
	bool isSameByClass(Cube& x)
	{
		if (x.getH() == m_H && x.getL() == m_L && x.getW() == m_W)
		{
			return true;
		}
		else {
			return false;
		}
	}
private:
	int m_L;
	int m_W;
	int m_H;
};
//利用全局函数判断,两个立方体是否相等
bool isSame(Cube& c1, Cube& c2)
{
	if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())
	{
		return true;
	}
	else
	{
		return false;
	}
}
int main()
{
	Cube c1;
	c1.setH(10);
	c1.setL(10);
	c1.setW(10);
	Cube c2;
	c2.setH(10);
	c2.setL(10);
	c2.setW(10);
	cout << "面积为:" << c1.Area(c1.getH(), c1.getH(), c1.getL()) << endl;
	cout << "体积为:" << c1.体积(c1.getH(), c1.getH(), c1.getL()) << endl;
	//利用成员函数判断立方体
	if (c1.isSameByClass(c2))
	{
		cout << "两个立方体相等" << endl;
	}
	else {
		cout << "两个立方体不相等" << endl;
	}
	//利用全局函数判断
	bool ret = isSame(c1, c2);
	if (ret)
	{
		cout << "两个立方体相等" << endl;
	}
	else {
		cout << "两个立方体不相等" << endl;
	}
}

这是案例的源代码,是个非常基础,能练习本篇博文内容的案例,希望大家可以理解其中的代码含义

到此这篇关于C++深入探索类和对象之封装及class与struct的区别的文章就介绍到这了,更多相关C++封装内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入解析C++中的auto自动类型推导

    深入解析C++中的auto自动类型推导

    C++标准委员会在C++11标准中改变了auto关键字的语义,使它变成一个类型占位符,允许在定义变量时不必明确写出确切的类型,让编译器在编译期间根据初始值自动推导出它的类型,下面我们就来看看auto自动类型推导的推导规则吧
    2024-04-04
  • QT圆形图像剪切功能实现

    QT圆形图像剪切功能实现

    这篇文章主要介绍了QT圆形图像剪切,实现代码包括剪切代码,完整QML源码,C++代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • FFmpeg进阶教程之给视频添加文字水印

    FFmpeg进阶教程之给视频添加文字水印

    FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,下面这篇文章主要给大家介绍了关于FFmpeg进阶教程之给视频添加文字水印的相关资料,需要的朋友可以参考下
    2022-11-11
  • C++ 基数排序的实现实例代码

    C++ 基数排序的实现实例代码

    这篇文章主要介绍了C++ 基数排序的实现实例代码的相关资料,这里附有实例代码,帮助大家学习理解,需要的朋友可以参考下
    2016-11-11
  • C++实现学生信息管理系统

    C++实现学生信息管理系统

    这篇文章主要为大家详细介绍了C++实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • MFC实现字幕滚动效果

    MFC实现字幕滚动效果

    这篇文章主要为大家详细介绍了MFC实现滚动字幕,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C++中 ‘=default ’及‘ =delete ’的使用

    C++中 ‘=default ’及‘ =delete ’的使用

    这篇文章主要介绍了C++中 =default 及 =delete 使用,使用=default和=delete可以控制编译器默认函数体的使用,下面我们就来看看具体的室友方法吧,需要的朋友也可以参考一下
    2021-12-12
  • C++11如何实现无锁队列

    C++11如何实现无锁队列

    这篇文章主要介绍了C++11如何实现无锁队列,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • Qt如何实现输入框@联系人的@检测的示例

    Qt如何实现输入框@联系人的@检测的示例

    本文主要介绍了Qt如何实现输入框@联系人的@检测的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C语言超详细讲解循环与分支语句基础

    C语言超详细讲解循环与分支语句基础

    各位小伙伴们,今天给大家带来的是循环与分支语句,本篇将会向大家介绍这些语句的格式和使用的基本方法,感兴趣的朋友来看看吧
    2022-04-04

最新评论