浅谈C++|类的封装篇

引子:

C++认为万事万物皆为对象,对象有其属性行为

人可以作为对象,属性有姓名,年龄,身高,体重等,行为有行走,吃饭,唱歌等。

车也可以作为一个对象,属性有轮胎,方向盘,车灯等,行为有载人,放音乐等。

1.封装

1.1封装的意义

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

封装的意义:

  (1)将属性和行为作为一个整体,表现生活中的事物。

  (2)将属性和行为加以权限控制。

1.1.1封装意义一:

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

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

实例:设置一个长方体类,并求其体积

代码:

#include <iostream>
using namespace std;
class cuboid {
public:
	int height;
	int weight;
	int length;
	int show_tiji() {
		return height * weight * length;
	}
};
int main() {
	cuboid a1;
	a1.height = 10;
	a1.weight = 10;
	a1.length = 90;
	cout << a1.show_tiji();
	return 0;
}

 1.1.2封装的意义二

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

访问权限有三种:

1.public        公有权限,类内可以访问,类外可以访问

2.protected   保护权限,类内可以访问,类外不可以访问

3.private       私有权限,类内可以访问,类外不可以访问

代码: 

#include <iostream>
using namespace std;
class people {
public:
	string name;
protected:
	string hose;
private:
	int m_Password;
public:
	void fun() {
		name = "小明";
		hose = "别墅";
		m_Password = 12345;
	}

};
int main() {
	people a;
	a.fun();
	cout << a.name << endl;
	//cout << a.hose << endl;   //报错
	//cout << a.m_Password << endl;   //报错
	return 0;
}

1.2struct和class的区别

1.2.1默认权限不同

权限分为成员访问权限和继承权限

默认成员权限:class是私有的,struct是公有的

默认继承权限:class是private,struct是public

默认成员权限代码: 

#include <iostream>
using namespace std;
class people1 {
	int a;
};
struct people2 {
	int a;
};
int main() {
	people1 a1;
	people2 a2;
	//a1.a = 100;   //报错
	a2.a = 100;
	return 0;
}

默认继承权限代码: 

#include <iostream>
using namespace std;
struct A {
	int m_a;
};

struct B :A {
	int m_b;
};
int main() {
	B b;
	b.m_a = 100;
	return 0;
}

struct默认为公有继承;

#include <iostream>
using namespace std;
class A {
public:
	int m_a;
};

class B :A {
public:
	int m_b;
};
int main() {
	B b;
	b.m_b = 100;
	//b.m_a = 100;
	return 0;
}

class默认私有继承

1.2.2能否定义模板参数

class可以定义模板参数  template<class  T>,而没有template<struct T>

 代码:

#include <iostream>
using namespace std;
//template< typename T, typename Y >	
template< class T >	
void  Func(T& t,T& y)
{
	T temp = t;
	t = y;
	y = temp;
}

int main() {
	int a = 10, b = 20;
	Func(a, b);
	cout << a << ' ' << b << endl;

	return 0;
}

1.2.3 class和struct相互继承

 默认的继承属性取决于子类而不是基类

代码: 

#include <iostream>
using namespace std;
class A {
public:
	int m_A;
};
struct B:A {
	int m_B;
};

int main() {
	B b;
	b.m_A = 10;
	b.m_B = 20;
	cout << b.m_A <<' '<<b.m_B << endl;
	return 0;
}

struct作为子类,默认公有继承

代码: 

#include <iostream>
using namespace std;
struct A {
	int m_A;
};
class B:A {
public:
	int m_B;
};

int main() {
	B b;
	//b.m_A = 10;  报错
	b.m_B = 20;
	cout<<b.m_B << endl;
	return 0;
}

1.2.4{}赋初值的讨论

因为C++是对C的扩充,那么它就兼容过去C中struct的特性

#include <iostream>
using namespace std;
struct A
{
	char 	a1;
	int		a2;
	double	a3;
};


int main() {
	A a = { 'p', 7, 451.154 }; //定义时赋初值,在struct时没问题,在class时出错
	return 0;
}

在struct中加入一个构造函数(或虚函数),struct也不能用{}赋值了,原因是以{}的方式来赋值,只是用一个初始化列表来对数据进行按顺序的初始化,如果上面写成A a = {‘p’,7};则a1,a2被初始化,而a3没有。这样简单的copy操作,只能发生在简单的数据结构上,而不应该放在对象上。加入一个构造函数或是一个虚函数会使strcut更体现出一种对象的特性,而是{}操作不再有效。因为加入这样的函数(构造和虚函数),使得类的内部结构发生了变化。而加入一个普通的成员函数呢?你会发现{}依旧可用。其实你可以将普通的函数理解成对数据结构的一种算法,这并不打破它数据结构的特性。
 

1.2.5总结 

  • 结构是实值类型(Value Types),而类则是引用类型(Reference Types)。
  • 结构使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)。

值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。
 

概念:class和struct的语法基本相同,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到
类型:struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异
效率:由于栈的执行效率要比堆的执行效率高,但是栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑
关系:struct不仅能继承也能被继承 ,而且可以实现接口,不过Class可以完全扩展。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段
 

1.2.6选用技巧

(1) 在表示诸如点、矩形等主要用来存储数据的轻量级对象时,首选struct

(2) 在表示数据量大、逻辑复杂的大对象时,首选class

(3) 在表现抽象和多级别的对象层次时,class是最佳选择 

1.3成员属性设置为私有化好处

1.3.1控制读写权限

可读可写权限,只读权限,只写权限

代码: 

#include <iostream>
using namespace std;
class people {
public:
	void get_name(string name_1) {
		name = name_1;          //写权限
	}
	string show_name() {
		return name;           //读权限
	}

	void get_mima(string mima1) {
		mima = mima1;          //写权限
	}
	int show_age() {           //读权限
		return age;
	}
private:
	//可读,可写
	string name;
	//只读
	int age;
	//只写
	string mima;

};
int main() {
	people p;
	p.get_name("小明");
	cout << p.show_name() << endl;
	p.get_mima("56789");
	cout << p.show_age();  //没有设置,随机值
	return 0;
}

 1.3.2写权限检测数据的有效性

 代码:

#include <iostream>
using namespace std;
class people {
public:
	void get_name(string name_1) {
		name = name_1;          //写权限
	}
	string show_name() {
		return name;           //读权限
	}

	void get_mima(string mima1) {
		if (mima1.size() < 3) {
			cout << "密码太短,无效!" << endl;
			return;
		}
		mima = mima1;          //写权限
	}
	int show_age() {           //读权限
		return age;
	}
private:
	//可读,可写
	string name;
	//只读
	int age;
	//只写
	string mima;

};
int main() {
	people p;
	p.get_name("小明");
	cout << p.show_name() << endl;
	p.get_mima("59");
	cout << p.show_age();  //没有设置,随机值
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
《深入出MFC》2/e 简体版 目录 第0章 你一定要知道(导读) 这本书适合谁 你需要什么技术基础 你需要什么软硬件环境 让我们使用同一种语言 本书符号习惯 本书例程的取得 范例程序说明 与前版本之差异 如何联络作者 第一篇 勿在浮砂筑高台 第1章 Win32程序基本概念 Win32程序开发流程 需要什么函数库(.LIB) 需要什么头文件(.H) 以消息为基础,以事件驱动之(message based,event driven) 一个具体而微的Win32程序 程序进入点WinMain 窗口类之注册与窗口之诞生 消息循环 窗口的生命中枢:窗口函数 消息映射(Message Map)的雏形 对话框的运行 模块定义文件(.DEF) 资源描述档(.RC) Widnows程序的生与死 空闲时间的处理:OnIdle Console程序 Console程序与DOS程序的差别 Console程序的编译链接 JBACKUP:Win32 Console程序设计 MFCCON:MFC Console程序设计 行程与线程(Process and Thread) 核心对象 一个行程的诞生与死亡 产生子行程 一个线程的诞生与死亡 以_beginthreadex取代CreateThread 线程优先级(Priority) 多线程程序设计实例 第2章 C++的重要性质 类及其成员——封装(encapsulation) 基类与派生类:继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态成员(变量与函数) C++程序的生与死:兼构造函数与解构函数 四种不同的对象生存方式(in stack、in heap、global、local static) 执行期类型信息(RTTI) 动态生成(Dynamic Creation) 异常处理(Exception Handling) Template Template Functions Template Classes Template的编译与链接 第3章 MFC六大关键技术之仿真 MFC类层次结构 Frame 1范例程序 MFC程序的初始化过程 Frame 2范例程序 RTTI(执行期类型识别) 类别型录网与CRuntimeClass DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏 Frame 3范例程序 IsKindOf(类型识别) Frame 4范例程序 Dynamic Creation(动态生成) DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE宏 Frame 6范例程序 Persistence(永久保存)机制 Serialize(数据读写) …… 第二篇 欲善工事先利其器 第4章 Visual C++集成开发环境 第三篇 出MFC程序设计 第5章 总观Application Framework 第6章 MFC程序的生死因果 第7章 简单而完整:MFC骨干程序 第四篇 深入MFC程序设计 第8章 Document-View深入探讨 第9章 消息映射与命令传递 第10章 MFC与对话盒 第11章 View功能的加强与重绘效率的提高 第12章 打印与预览 第13章 多重文件与多重显示 第14章 MFC多线程程序设计 第15章 定制一个AppWizard 第16章 站上众人的肩膀——使用Components&activeX; Controls
### 回答1: C++中的类是面向对象编程的基本单元,其中封装是其最重要的特征之一。封装可确保数据和函数都能被保护起来,不会被外部访问和修改,而只能通过类定义的公共接口来操作这些数据。 Dll是动态链接库(Dynamic Link Library)的缩写,它是一种库文件,可以在编译时链接到可执行文件,也可以在运行时加载。封装在动态链接库中使用可以更好地保障其安全性和灵活性。 在C++中,类的封装可以被编译成动态链接库,也称为类库(Class Library)。这种方式可以使开发者将代码分成多个库文件,并且仅将需要的库文件链接到可执行文件中。这种方式可以在多个程序之间共享类定义和函数实现,减少代码重复并提高代码的可维护性。 同时,如果只需修改类库中的某个类的实现,而其他类的实现没有改变,那么只需重新编译该库就可以了,而不用重新编译所有代码。 在使用动态链接库时,需要使用C++的导出和导入关键字将类和函数导出到DLL中,并在可执行程序中使用它们。这些关键字包括__declspec(dllexport)和__declspec(dllimport)等。 总之,在C++中使用类的封装和dll可以使代码变得更加安全,可维护性更高,并有效地减少代码重复。 ### 回答2: C语言中,类的封装需要使用结构体和函数来实现,其中结构体表示对象的属性,而函数则表示对象的方法。为了更好地维护代码,实现代码的复用,我们可以将类的封装通过dll动态链接库的方式实现。 首先,我们需要定义一个包含结构体和函数声明的header文件,用来描述类的结构和功能,然后将这个header文件编译成动态链接库,供其他程序调用。这样做的好处在于,只要我们在其他程序中引用了这个dll,就可以直接使用这个类,无需重新编写代码,提高了代码的复用性。 同时,在dll封装中,我们也需要注意一些问题,比如动态链接库的版本问题,如果不同的程序引用了不同版本的dll,可能会出现运行错误,所以需要在编写dll时考虑这些问题。在使用dll时,也需要注意动态链接库的加载和释放问题,防止出现内存泄漏等问题。 总之,通过dll的封装,可以更加方便地实现C语言中的类的封装,提高代码的复用性和可维护性,但需要在实现过程中注意一些问题,提高代码的质量。 ### 回答3: C++类的封装 DLL是一种将类库打包为可重用代码的方式。DLL全称为Dynamic Link Library,动态链接库。它是一种Windows系统下的动态链接库文件,提供了一种动态加载可以在运行时执行的代码和数据的方式。使用DLL的好处在于,它可以节省资源并提高程序的灵活性。 C++类的封装 DLL可以将类封装为可直接调用的动态链接库。这样,其他程序就可以直接使用这个类库,而无需自行编写相应的代码。使用DLL可以使程序员们更加专注于自己的工作而不必担心代码的实现细节。 封装DLL还有另外一些优点,例如:DLL文件可以被多个应用程序所共享,因此可以减少内存的消耗,提高程序的运行效率。同时,类库也可以在项目开发过程中进行独立开发和单元测试,这样可以更好地提高程序的质量和可维护性。 总之,C++类的封装 DLL是一种非常有用的开发技术,它能够有效地提高程序的复用性、可移植性和可维护性。因此,对于需要维护大型项目的开发团队来说,封装DLL是一种非常具有实际意义的开发策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

左手的月光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值