c++第3讲类的定义与实现(封装)
- 格式:pdf
- 大小:714.24 KB
- 文档页数:113
类的封装性的理解类作为面向对象程序设计方法的主要特征,它有异于面向过程程序设计方法。
不仅仅表现在它更接近于人类的思维,而在于它具有安全性、可重用性等特点,而类的安全性就是由类的封装性所作用的。
1.类与主函数的封装对于一个类,它有三种类型,即public、private、protected。
这三种类型共同组成一个类。
总的来说,类是一个封闭的整体,是对某一事物的共性的抽象的描述,它不能被直接运用。
也因为这个特点,类具有了安全性。
通过类的public 类型,它作为一个外部接口,无论是对于主函数中或是派生类,它将整个类与外界联系起来。
所以在主函数中要想调用类中的成员函数函数(除私有和保护)就必须要定义一个此类的对象,然后利用对象对类中的公有的函数成员或公有的数据成员进行调用。
2.类与类之间的封装和隐藏类的封装性在类的派生和继承中主要表现在它的继承方式。
即public、private、protected继承。
对于public继承,其基类除构造函数和析构函数外,其他的成员或数据函数均被继承,类型仍是原来的不变;对于private继承方式,基类无论是什么类型,在派生类中他们都变为私有;而对于protected继承,其基类的成员类型也不变。
但应注意无论是哪种继承方式,其基类中的私有变量是无法继承的。
在一般情况下,private和protected类型没有什么差别,然而在继承时,protected能将上一级为protected类型的数据成员保留下来,克服了privat 里的数据成员不能被继承的缺点。
当然,对于继承和派生,如果是对于多个派生类继承一个基类,而另一个派生类又继承上层的类(如图),则就引出了虚基类,使得从不同的路径继承过来的同名函数在内存中只有一个拷贝,解决了函数的二意性问题。
但对于函数的隐藏性(如图2),在类的概念中又引出了虚函数和纯虚函数的概念,以此来解决不同类中同名函数的的输出问题。
而虚函数和纯虚函数的区别主要是表达方式上的差异,纯虚函数是没有又函数体的,而虚函数是需要函数体的,也就因为这样,我们仅把拥有纯虚函数的类叫做抽象类,它是一类自身无法实例化,只有通过继承和派生才能实现事例化。
C++中的封装、继承、多态理解封装(encapsulation):就是将抽象得到的数据和⾏为(或功能)相结合,形成⼀个有机的整体,也就是将数据与操作数据的源代码进⾏有机的结合,形成”类”,其中数据和函数都是类的成员。
封装的⽬的是增强安全性和简化编程,使⽤者不必了解具体的实现细节,⽽只是要通过外部接⼝,特定的访问权限来使⽤类的成员。
封装可以隐藏实现细节,使得代码模块化。
继承(inheritance):C++通过类派⽣机制来⽀持继承。
被继承的类型称为基类或超类,新产⽣的类为派⽣类或⼦类。
保持已有类的特性⽽构造新类的过程称为继承。
在已有类的基础上新增⾃⼰的特性⽽产⽣新类的过程称为派⽣。
继承和派⽣的⽬的是保持已有类的特性并构造新类。
继承的⽬的:实现代码重⽤。
派⽣的⽬的:实现代码扩充。
三种继承⽅式:public、protected、private。
继承时的构造函数:(1)、基类的构造函数不能被继承,派⽣类中需要声明⾃⼰的构造函数;(2)、声明构造函数时,只需要对本类中新增成员进⾏初始化,对继承来的基类成员的初始化,⾃动调⽤基类构造函数完成;(3)、派⽣类的构造函数需要给基类的构造函数传递参数;(4)、单⼀继承时的构造函数:派⽣类名::派⽣类名(基类所需的形参,本类成员所需的形参):基类名(参数表) {本类成员初始化赋值语句;};(5)、当基类中声明有默认形式的构造函数或未声明构造函数时,派⽣类构造函数可以不向基类构造函数传递参数;(6)、若基类中未声明构造函数,派⽣类中也可以不声明,全采⽤缺省形式构造函数;(7)、当基类声明有带形参的构造函数时,派⽣类也应声明带形参的构造函数,并将参数传递给基类构造函数;(8)、构造函数的调⽤次序:A、调⽤基类构造函数,调⽤顺序按照它们被继承时声明的顺序(从左向右);B、调⽤成员对象的构造函数,调⽤顺序按照它们在类中的声明的顺序;C、派⽣类的构造函数体中的内容。
继承时的析构函数:(1)、析构函数也不被继承,派⽣类⾃⾏声明;(2)、声明⽅法与⼀般(⽆继承关系时)类的析构函数相同;(3)、不需要显⽰地调⽤基类的析构函数,系统会⾃动隐式调⽤;(4)、析构函数的调⽤次序与构造函数相反。
类的封装规则一、类的封装规则概述1.1 定义与概念类的封装规则是一种面向对象编程的策略,其核心思想是将对象的属性和行为封装成一个独立的实体,称为类。
类的封装性是一种把数据(变量)和与数据相关的操作(函数)结合在一起的特性。
这种特性有效地隐藏了数据的细节,只通过类的方法来与外界交互。
类的封装性可以增强代码的安全性、可读性和可维护性。
1.2 历史与发展类的封装规则源于20世纪70年代的面向对象编程(OOP)思想。
在早期的程序设计中,为了提高代码的可维护性和可重用性,人们开始尝试将数据和操作封装在一起,形成了类的概念。
随着计算机技术的不断发展,面向对象编程逐渐成为主流的编程范式,类的封装规则也得到了广泛应用。
二、类的封装规则基本概念2.1 封装定义封装是指将数据(变量)和与数据相关的操作(函数)结合在一起,形成一个独立的实体,即类。
这个实体可以对外界隐藏其内部实现细节,只通过类的方法来与外界进行交互。
2.2 封装原则类的封装原则通常包括:隐藏数据、只通过公共方法访问数据、封装可变性和封装实现细节。
这些原则有助于提高代码的可维护性和可重用性。
2.3 封装方法常见的封装方法包括:构造函数、访问器方法(getter和setter)、私有变量、公共变量等。
这些方法可以帮助我们实现数据的封装和控制,确保数据的正确性和安全性。
三、类的封装规则在编程中的应用3.1 面向对象编程应用面向对象编程是一种基于对象概念的编程范式,它使用类和对象来描述现实世界中的实体和它们之间的关系。
类的封装规则是面向对象编程的核心特征之一,它可以将数据和相关操作封装在一起,形成一个独立的实体,以实现代码的可重用性和可维护性。
3.2 数据抽象应用类的封装规则可以通过数据抽象来实现对数据的隐藏和控制。
通过将数据封装在类中,我们可以实现对数据的访问控制和安全性保护,避免外部代码直接访问和修改数据的细节,从而提高了代码的可维护性和可重用性。
3.3 信息隐蔽应用类的封装规则还可以实现信息隐蔽,即将类的实现细节隐藏起来,只向外部提供必要的接口和方法。
类的封装的定义
一、类的封装
类的封装,是一种将一组相关的变量和函数封装成一个独立的数据类型的技术,以提高程序的可维护性、可重用性。
类的封装,可以将一组相关的变量和函数封装在一个独立的自定义数据类型内,这种独立的数据类型称为类,类是一种抽象,它可以把相关的信息和数据封装起来,便于维护和使用,从而提高程序的可维护性和可重用性。
二、类的封装特性
(1)数据封装
类的封装最大的优点之一是将数据和它们的操作封装在一个结构里面,使得数据操作更加简单、快捷。
(2)访问控制
类可以通过类的修饰符来控制访问权限,使得部分数据和函数只能被类本身所调用,这样可以保证自己的资源不被滥用。
(3)抽象
类能够把复杂的具体事物抽象成一个独立的实体,以便让程序进行更有效的管理。
(4)继承
类具有继承的能力,可以将相关的操作封装放到基类中,而子类只需要根据需要进行相应的改进和扩展,这样可以减少代码的冗余,提高程序的可复用性。
C实现类封装、继承、多态1、概述C语⾔是⼀种⾯向过程的程序设计语⾔,⽽C++是在C语⾔基础上衍⽣来了的⾯向对象的语⾔,实际上,很多C++实现的底层是⽤C语⾔实现的,如在Visual C++中的Interface其实就是struct,查找Interface的定义,你可以发现有这样的宏定义:#ifndef Interface#define Interface struct#endifC++在语⾔级别上添加了很多新机制(继承,多态等),⽽在C语⾔中,我们也可以使⽤这样的机制,前提是我们不得不⾃⼰实现。
本⽂介绍了⽤C语⾔实现封装,继承和多态的⽅法。
2、基本知识在正式介绍C语⾔实现封装,继承和多态事前,先介绍⼀下C语⾔中的⼏个概念和语法。
(1)结构体在C语⾔中,常把⼀个对象⽤结构体进⾏封装,这样便于对对象进⾏操作,⽐如:strcut Point{int x;int y;};结构体可以嵌套。
因⽽可以把⼀个结构体当成另⼀个结构体的成员,如:struct Circle {struct Point point_;int radius;};该结构体与以下定义完全⼀样(包括内存布置都⼀样):struct Circle {int x;int y;int radius;};(2)函数指针函数指针是指针的⼀种,它指向函数的⾸地址(函数的函数名即为函数的⾸地址),可以通过函数指针来调⽤函数。
如函数:int func(int a[], int n);可以这样声明函数指针:int (*pFunc)(int a[], int n);这样使⽤:pFunc = func;(*pFunc)(a, n);【或者PFunc(a, n)】可以⽤typedef定义⼀个函数指针类型,如:typdef int (*FUNC)(int a[], int n)可以这样使⽤:int cal_a(FUNC fptr, int a[], int n){//实现体}(3) extern与staticextern和static是C语⾔中的两个修饰符,extern可⽤于修饰函数或者变量,表⽰该变量或者函数在其他⽂件中进⾏了定义;static也可⽤于修饰函数或者变量,表⽰该函数或者变量只能在该⽂件中使⽤。
C++类的定义与实现⽬录⼀、类的定义⼆、类的实现1.成员函数2.内联函数⽂章转⾃微信公众号:Coder梁(ID:Coder_LT)⼀、类的定义根据C++ Primer中的描述,类的定义是⼀种将抽象转换为⽤户定义类型的C++⼯具。
也就是说类的实质是⼀种⽤户⾃定义类型,它可以将数⽬表⽰和操作数据的⽅法组合成⼀个整洁的包。
在实际开发当中,想要实现⼀个类,并编写⼀个使⽤它的程序是相对⽐较复杂的,涉及多个步骤。
通常,我们会将类的定义放在头⽂件当中,并将实现的代码放在源代码⽂件中。
我们来看C++ Primer当中的⼀个例⼦:⼀个关于股票买卖的类。
⾸先是类的定义,写在stock00.h⽂件中:#ifndef STOCK00_H_#define STOCK00_H_#include <string>class Stock {private:std::string company;long shares;double share_val;double total_val;void set_tot() {total_val = shares * share_val;}public:void accquire(const std::string &co, long n, double pr);void buy(long num, double price);void sell(long num, double price);void update(double price);void show();};#endif⾸先是关键字class,它表⽰我们声明的是⼀个类,⼀般类名我们使⽤⼤驼峰命名法定义。
其次在这个类的定义当中,我们看到了两个新出现的关键字private和public。
这两个关键字描述了对类成员的访问控制,使⽤类对象的程序,都可以直接访问公有部分(public),但⽆法访问对象的私有成员。
类模板类模板也称为类属类或类生成类,是为类定义的一种模式,它使类中的一些数据成员和成员函数的参数或返回值可以取任意的数据类型。
类模颁布是一个具体的类,它代表着一族类,是这一族类的统一模式。
使用类模板就是要将它实例化为具体的类。
定义类模板的一般形式为:template<class 数据类型参数标识符>class 类名{//……}其中,template是声明类模板的关键字;template后面的尖括号不能省略;数据类型参数标识符是类模板中参数化的类型名,当实例化类模板时,它将由一个具体的类型来代替。
定义类模板时,可以声明多个类型参数标识符,各标识符之间用逗号分开。
类定义中,凡要采用标准数据类型的数据成员、成员函数的参数或返回类型的前面都要加上类型标识符。
如果类中的成员函数要在类的声明之外定义,则它必须是模板函数。
其定义形式为:template<class 数据类型参数标识符>数据类型参数标识符类名<数据类型参数标识符>∷函数名(数据类型参数标识符形参1,……,数据类型参数标识符形参n){函数体}模板类将类模板的模板参数实例化后生成的具体的类,就是模板类。
由类模板生成模板类的一般形式为:类名<数据类型参数标识符>对象名1,对象名2,…,对象名n;这里的数据类型参数标识符对应的是对象实际需要的数据类型。
6.4 应用举例例6.1 函数模板的声明和模板函数的生成的例。
#include<iostream.h>template<typename T> //声明模板函数,T为数据类型参数标识符void swap(T &x, T &y) //定义模板函数{T z; //变量z可取任意数据类型及模板参数类型Tz=y;y=x;x=z;}void main(){int m=1,n=5;double a=8.9,b=3.4;cout<<”m=”<<m<<”n=“<<n<<endl;cout<<”a=”<<a<<”b=”<<b<<nedl;swap(m,n); //实例化为整型模板函数swap(a,b); //实例化为双精度型模板函数cout<<“m与a,n与b交换以后:”<<endl;cout<<”m=”<<m<<”n=“<<n<<endl;cout<<”a=”<<a<<”b=”<<b<<endl;}程序运行结果:m=1 n=5a=8.9 b=3.4m与a,n与b交换以后:m=5 n=1a=3.4 b=8.9例6.2 类模板的声明和模板类的生成的例。
封装是面向对象编程中的一个重要概念,它是指将对象的属性和方法捆绑在一起,形成一个独立的实体。
通过封装,我们可以隐藏对象的内部实现细节,只暴露必要的接口,从而保护对象的状态并控制对它的访问。
在编程中,我们通常使用类来封装数据和行为。
类定义了一个对象的蓝图,包括它的属性和方法。
一个类可以包含私有属性和方法(只能在类内部访问)和公有属性和方法(可以从类的外部访问)。
通过将属性设置为私有,我们可以确保它们不会被外部代码直接修改,而只能通过类提供的方法进行操作。
这样,我们可以在不破坏现有代码的情况下修改类的内部实现,这是封装的一个重要优点。
封装的另一个优点是提高代码的可维护性。
由于对象的内部实现细节被隐藏在类内部,因此当类的实现发生更改时,使用该类的代码不需要修改。
这使得代码更容易理解和维护,降低了软件开发的成本。
此外,封装还有助于提高代码的安全性。
通过限制对内部状态的访问,我们可以防止外部代码意外地修改对象的状态或破坏其完整性。
这有助于减少错误和调试时间,并提高应用程序的可靠性。
总之,封装是面向对象编程中的一个关键概念,它通过隐藏对象的内部实现细节并提供有限的访问接口来保护对象的状态和行为。
通过使用封装,我们可以提高代码的可维护性、安全性和可重用性。