带你从头学习C++的封装

目录
  • 封装
    • 属性和行为作为整体
    • 实例—设计学生类
    • 访问权限
    • class与struct区别
    • 成员属性私有化
    • 设计立方体类
  • 总结

封装

c++认为万事万物皆为对象,对象上有其属性和行为

封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物
  • 将属性和行为加以权限控制

 封装意义一:

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

语法:

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

属性和行为作为整体

#include<iostream>
using namespace std;
//圆周率
const double PI = 3.14;
//设计一个圆类,求圆的周长
//圆求周长的公式:2*PI*半径
class Circle {
	//访问权限
	//公共权限
public:
 		//属性
		//半径
 		int m_r;
	//行为
	//获取圆的周长
		double calculateZC() {
			return 2 * PI * m_r;
		}
};
 int main() {
	//通过圆类,创建具体的圆(对象)
	//实例化  (通过一个类 创建一个对象的过程)
	Circle c1;
	//给圆对象的属性进行赋值
	c1.m_r = 10;
	//2 * PI * m_r = 62.8;
	cout << "圆的周长为:" << c1.calculateZC () << endl;
	system("pause");
	return 0;
}

实例—设计学生类

#include<iostream>
using namespace std;
//#include<string>
//设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
//设计学生类
class Student {
public://公共权限
	//类中的属性和行为 我们统一称为 成员
	//属性 成员属性 成员变量
	//行为 成员函数 成员方法
 	//属性
	string m_Name;//姓名
	int m_Id;//学号
	//行为
	//显示姓名和学号
	void showStudent() {
		cout << "姓名:" << m_Name << "  学号:"<<m_Id << endl;
	}
	//给姓名赋值
	void setName(string name) {
		m_Name = name;
	}
	void setId(int Id) {
		m_Id = Id;
	}
};
int main() {
	//创建一个具体的学生  实例化对象
	Student s1;
	//给s1对象进行属性赋值操作
	//s1.m_Name = "张三";
	s1.setName("张三");
	//s1.m_Id = 1;
	s1.setId(1);
	s1.showStudent();
 	Student s2;
	s2.m_Name = "李四";
	s2.m_Id = 2;
	s2.showStudent();
	system("pause");
	return 0;
}

访问权限

封装意义二:

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

权限访问有三类:

  • public         公共权限
  • protected    保护权限
  • private        私有权限
#include<iostream>
using namespace std;
//访问权限
//三种
//公共权限 public        成员  类内可以访问  类外也能访问
//保护权限 protected     成员  类内可以访问  类外不可以访问 儿子可以访问到父亲中的保护内容
//私有权限 private		 成员  类内可以访问  类外不可以访问 儿子不可以访问到父亲的私有内容
class Person {
public:
	//公共权限
	string m_Name;//姓名
protected:
	//保护权限
	string m_Car;//汽车
private:
	int m_Password;//银行卡密码
public:
	void func() {
		m_Name = "张三";
		m_Car = "拖拉机";
		m_Password = 123456;
	}
};
int main() {
	//实例化具体对象
	Person p1;
	p1.m_Name = "李四";
	//p1.m_Car = "奔驰";//保护权限的内容,在类外访问不到
	//p1.m_Password = 123;//私有权限的内容,在类外访问不到
   	system("pause");
	return 0;
}

class与struct区别

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

区别:

  • struct默认权限为公共
  • class默认权限为私有
#include<iostream>
using namespace std;
class C1 {
 	int m_A;//默认权限 是私有
};
struct C2 {
	int m_A;//默认权限 是公共
};
int main() {
	//struct和class区别
	//struct 默认权限是 公有 public
	//class  默认权限是 私有 private
	C1 c1;
	//c1.m_A = 100;//在class里默认权限 私有,因此类外不可以访问
 	C2 c2;
	c2.m_A = 100;//在struct默认的权限为公共,因此可以访问
	system("pause");
	return 0;
}

成员属性私有化

  • 优点1:将所有成员属性设为私有,可以自己控制读写权限
  • 优点2:对于写权限,我们可以检测数据的有效性
#include<iostream>
using namespace std;
#include<string>
//成员属性设置为私有
//1.可以自己控制读写权限
//2.可以写可以检验数据的有效性
//设计人类
class Person {
public:
	//设置姓名
	void setName(string name) {
		m_Name = name;
	}
	//获取姓名
	string getName() {
		return m_Name;
	}
	//获取年龄  只读
	int getAge() {
		//m_Age = 0;//初始化零岁
		return m_Age;
	}
	void setAge(int age) {
		if (age < 0 || age>150) {
			m_Age = 0;
			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.m_Age = 18;
	//p.setAge(18);
	p.setAge(18);
	cout << "年龄为:" << p.getAge() << endl;
	//设置情人为苍井女士
	p.setLover("苍井");
	//cout<<"情人为:"<<p.m_Lover << endl;只写权限,数据不可以访问到的
 	system("pause");
	return 0;
}

设计立方体类

#include<iostream>
using namespace std;
//立方体类设计
//1.创建立方体类
//2.设计属性
//3.设计行为 获取立方体面积和体积
//4.分别利用全局函数和成员函数 判断两个立方体是否相等
 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 calculateS() {
		return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_W * m_H;
	}
	// 获取立方体体积
	int calculateV() {
		return m_L * m_W * m_H;
	}
	//利用成员函数判断两个立方体是否相等
	bool isSameByClass(Cube &c) {
		if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH()) {
			return true;
		}
		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;
	}
	return false;
}
int main() {
	//创建立方体对象
	Cube c1;
	c1.setL(10);
	c1.setW(10);
	c1.setH(10);
	cout << "c1的面积为:" <<c1.calculateS() << endl;
	cout << "c1的体积为:" << c1.calculateV() << endl;
	//创建第二个立方体
	Cube c2;
	c2.setL(10);
	c2.setW(10);
	c2.setH(10);
 	//利用全局函数判断
	bool ret = isSame(c1,c2);
	if (ret) {
		cout << "c1和c2是相等的" << endl;
	}
	else {
		cout << "c1和c2是不相等的" << endl;
	}
	//利用成员函数判断
	ret = c1.isSameByClass(c2);
	if (ret) {
		cout << "成员函数判断的:c1和c2是相等的" << endl;
	}
	else {
		cout << "成员函数判断的:c1和c2是不相等的" << endl;
	}
	system("pause");
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++动态数组类的封装实例

    C++中的动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构造函数.拷贝构造函数.拷贝赋值运算符.析构函数).运算符的重载.涉及到的知识点很多,对此本文只做简单的介绍. 一.内存分配策略 当用new为一个动态数组申请一块内存时,数组中的元素是连续存储的,例如 vector和string.当向一个动态数组添加元素时,如果没有空间容纳新元素,不可能简单

  • 深入解析C++编程中类的封装特性

    共用接口和私有实现的分离 C++通过类来实现封装性,把数据和与这些数据有关的操作封装在一个类中,或者说,类的作用是把数据和算法封装在用户声明的抽象数据类型中. 实际上用户往往并不关心类的内部是如何实现的,而只需知道调用哪个函数会得到什么结果,能实现什么功能即可. 在声明了一个类以后,用户主要是通过调用公用的成员函数来实现类提供的功能(例如对数据成员设置值,显示数据成员的值,对数据进行加工等).因此,公用成员函数是用户使用类的公用接口(public interface),或者说是类的对外接口. 类

  • C++中的封装、继承、多态理解

    封装(encapsulation):就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员.封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,特定的访问权限来使用类的成员.封装可以隐藏实现细节,使得代码模块化. 继承(inheritance):C++通过类派生机制来支持继承.被继承的类型称为基类或超类,新产生的类为派生类或子类.保持已有类的特性而构造新类的过

  • C++封装线程类的实现方法

    本文实例讲述了C++封装线程类的实现方法.分享给大家供大家参考.具体方法如下: 复制代码 代码如下: // 给主窗口的通知消息  #define WM_CUTTERSTART WM_USER + 100    // wParam == xxx  lParam==xxxx    /*  外面调用这个类时,只需要IsRunning() Startxxx(xxx) Suspendxxx()   Resumexxx() Stopxxx()  */    /*  m_bContinue在真正的工作代码Do

  • c++11封装thread库的方法示例

    前言 c++11在语言层面上提供了对thread的支持,由于不同的平台提供了不同线程API,在语言层面提供了对thread的支持可以大大的减小代码移植的工作量. 本文将给大家详细介绍关于c++11封装thread库的相关内容,下面话不多说了,来一起看看详细的介绍吧 基本接口要求 要求std::thread的构造函数 template< class Function, class... Args > explicit thread( Function&& f, Args&

  • 带你从头学习C++的封装

    目录 封装 属性和行为作为整体 实例—设计学生类 访问权限 class与struct区别 成员属性私有化 设计立方体类 总结 封装 c++认为万事万物皆为对象,对象上有其属性和行为 封装的意义: 将属性和行为作为一个整体,表现生活中的事物 将属性和行为加以权限控制  封装意义一: 在设计类的时候,属性和行为写在一起,表现事物 语法: class  类名{  访问权限:属性 / 行为}: 属性和行为作为整体 #include<iostream> using namespace std; //圆周

  • vue3学习笔记简单封装axios示例实现

    目录 简介 openapi 基本配置 拦截器 api请求 数据渲染 简介 axios是一个基于promise的网络请求库,管理后台使用的场景通常 获取后端api数据,然后交给页面渲染 还是在前面的示例项目上操作,安装axios最新0.27.2版本 cd HELLO-WORLD npm install axios 复制代码 openapi 在网上找到一个开放的openapi地址,免费且无需认证就可以使用 方便开发时模拟接口数据,但不能使用在生产环境中 该openapi返回json数据,比较符合我们

  • 学习JavaScript设计模式(封装)

    在JavaScript 中,并没有对抽象类和接口的支持.JavaScript 本身也是一门弱类型语言.在封装类型方面,JavaScript 没有能力,也没有必要做得更多.对于JavaScript 的设计模式实现来说,不区分类型是一种失色,也可以说是一种解脱. 从设计模式的角度出发,封装在更重要的层面体现为封装变化. 通过封装变化的方式,把系统中稳定不变的部分和容易变化的部分隔离开来,在系统的演变过程中,我们只需要替换那些容易变化的部分,如果这些部分是已经封装好的,替换起来也相对容易.这可以最大程

  • 从头学习C语言之字符串处理函数

    目录 字符串处理函数: 存放和使用字符串: 获取字符串长度:strlen 示例: 拷贝字符串:strcpy和strncpy 示例: strncpy: 示例: 连接字符串:strcat和strncat 示例: 比较字符串:strcmp和ctrncmp strncmp和strcmp和区别: 示例: 总结 字符串处理函数: 存放和使用字符串: 字符串常量:“fishc”,“小甲鱼”,“鱼C工作室”字符数组: 获取字符串长度:strlen 用法:strlen(str) 注意: 这个函数获得的是长度(不带

  • 从头学习C语言之switch语句和分支嵌套

    目录 switch 语句: 注意事项: 分支结构的嵌套: 注意事项: 语句形式: 流程图: 示例: 总结 switch 语句: 一个 switch 语句允许测试一个变量等于多个值时的情况.每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查. 注意事项: 在case每一行的语句或程序块后面要加上break;(否则程序将会把所有程序块从前到后运行一遍. default是可选的,如果上面的case中没有符合的才会选择default(属于备选情况),但是如果不加defau

  • 一篇文章带你深入学习Python函数

    目录 函数的特性: 函数是对象: 函数可以删除: 总结 函数的特性: 函数是对象 函数可以删除 函数名字和函数本身完全是分开的 函数因为是对象,可以结合数据结构使用 函数因为是对象,可以作为函数参数 函数因为是对象,可以在嵌套在函数体内 内层函数对象能够记忆住父函数的变量 所有的函数都是对象,但是所有的对象并不一定都是函数 对象成为函数需要实现__call__协议 函数是对象: # 函数是对象:支持赋值操作. def test1(n): print(f"hello, {n}!") #

  • 从头学习C语言之二维数组

    目录 二维数组: 语法: 二维数组存放方式: 二维数组的访问: 二维数组的初始化: 示例: 总结 二维数组: 引入一个想法: 一个变量:相当于一个点. 一维数组(也就是数组):点汇聚成为一条直线. 二维数组:直线汇聚成一个平面. 三维数组:平面汇聚成立体图形. 语法: 类型 数组名[常量表达式][常量表达式] int a[6][6];//6*6,6行6列 char b[4][5];//4*5,4行5列 double c[6][3];//6*3,6行3列 二维数组存放方式: 二维数组的访问: 数组

  • 从头学习C语言之if语句的使用

    目录 if语句: if语句的三种基本形式. 1 示例 2. 示例 3. 示例 课堂实践环节: 总结 if语句: 作用: 构成分支结构.(它根据给定的条件进行判断,以决定执行某个分支程序段.) if语句的三种基本形式. 1 .…//其他语句if(表达式){…//逻辑值为真所执行的语句.程序块}…//其他语句 流程图 示例 #include <stdio.h> int main() { int a,b,max; printf("输入两个数来比较大小:"); scanf(&quo

  • 从头学习C语言之指针和数组

    目录 指针和数组: 示例: 总结 指针和数组: 数组名其实是数组第一个元素的地址. %p用来打印地址,为十六进制 &:取址操作符 如果用一个指针指向数组,应该怎么做呢? char *p; p=a;//语句1 p=&a[0];//语句2 指针的运算: 当指针指向数组元素的时候,我们可以对指针变量进行加减运算,这样做的意义相当于只想距离指针所在位置向前或向后第n个元素. 对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法. 需要郑重强调的是:p+1并不是简单的将地址加1,二

  • 从头学习C语言之for语句和循环嵌套

    目录 for语句: 前言: 注意事项: 语句形式: 执行顺序: 示例: 循环嵌套: 语句形式: 流程图: 示例: 总结 for语句: 前言: 循环的基本结构离不开三个基本动作: 初始化计数器 循环条件 更新计数器 int count=0; while(count<10) { printf("fishc!\n); count=count+1; 注意事项: 1.C99允许再for语句的表达式1中定义变量(在for循环里定义的变量出了循环就不能用了), 如:for(int i=0;i<10

随机推荐