初学者C++面向对象程序设计概念全总结最全的概念总结


1、对象和类概念

对象:任何一个对象都应该具备两个要素:属性、行为。

在C++中每个对象都有数据(体现了‘属性’)和函数(用来对数据进行操作,以实现某些功能)两部分组成。

类:具有共性的实体的抽象。

类是对象的抽象,不占有内存。对象是类的特例,即类的具体表现形式,占有存储空间。

C++使用class关键字用于定义类,和struct关键字的用法相同。只不过class关键字默认的类型为private.私有成员只能被本类中的成员函数调用。

2、面向对象的三大特性:封装、继承、多态。

封装:将方法和数据封装在类里面,可以根据访问限定符的使用保证数据的安全性,隐藏了方法的实现细节,也方便使用。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是通过外部接口以及特定的访问权限来使用类的成员。

继承:对已有类增加属性和功能或进行部分修改来建立新的类,是实现代码的复用的重要手段,继承是类型之间的关系建模。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码,在令子类继承父类的同时,可以重新定义某些属性,并重新某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能,继承是指一个对象直接使用另一个对象的属性和方法。

多态:在面向对象的程序里面,同一个消息被不同的对象接受后可以导致不同的行为,是接口的多种不同的实现方式,极大的提高了代码的重用。多态性,允许将子类类型的指针赋值给父类类型的指针,多态性在C++中是通过虚函数实现的。虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”,或者称为“重写”。子类重写父类中虚函数时,即使不用virtual声明,该重载函数也是虚函数。

抽象:表示同一类事务的本质。

3、对象的引用

A. 同一类的对象可以相互赋值。

B. 在一个类中至少有一个公用的成员函数作为对外的接口。公用成员函数是用户使用类的公用接口,或者类的对外接口。外界只能通过公用成员函数来实现对类内的私有函数进行操作。

C. 当类中有指针且有动态内存分配时,不要随便赋值,有可能会出现问题。

D. ::是作用域的限定符,声明函数或者变量是属于哪个类的。

E. 内置成员函数:C++对一般的内置函数需要使用关键字inline声明,在调用函数时,并不是真正的执行调用的过程,而是把函数的代码嵌入程序的调用点,大大减少调用函数的时间开销。对于类内定义的成员函数,可以省略关键字inline,C++默认类内的成员函数为内置函数。但是如果陈元函数在类体外定义时,系统并不默认为内置函数,需要在声明与定义的时候加上inline关键字说明(必须将类定义和成员函数的定义放在同一个头文件中或者卸载同一个源文件中,否则编译无法进行置换)。

F. C++对类的每个对象所占有的存储空间只是该对象的数据成员所占有额存储空间,而不包括函数代码所占有的存储空间,与成员函数无关。而这些对象的成员函数对应的是同一个函数代码段。

G. 不管成员函数在类内定义还是类外定义,不论是否用inline声明,成员函数的代码段的存储方式是相同的,都不占用对象的存储空间。Inline函数只影响程序的执行效率,而与成员函数是否占有对象的存储空间无关。

H. 对象成员引用的方式:

1 通过对象名与成员运算符访问对象中的成员---------对象名.成员名---------stud.num

2. 通过指向对象的指针访问对象的成员-------------指针—>成员名-----------------p—>num

3. 通过对象的引用来访问对象的成员。

I. 类的公用接口与实现分离:

通过成员函数对数据进行操作称为类的功能实现,为了防止用户任意的修改公用成员函数,改变对数据进行的操作,往往不让用户看到公用成员函数的源代码,用户只能接触到公用函数的目标代码。类内被操作的数据是私有的,类的功能实现细节是对用户屏蔽的。这种实现称为私有实现。这种类的公用借口与实现分离形成了信息屏蔽,用户接触到的是公用接口,而不能接触到被屏蔽的数据与实现的细节。

好处:(1)如果要修改或扩充类的功能,只需修改该类中有关的数据成员与成员函数,成语中类以外的部分可以不必修改。(2)编译时发现勒种的数据读写有错,不必检查整个程序,只需要检查本类中访问的这些数据的少数成员函数。

J. 把类的声明放在指定的头文件中,用户要使用该类,只需要把有关的头文件包含进来即可。不必再程序中重复书写类的声明,以减少工作量,节省篇幅,提高编程的效率。

K. 一个C++程序是有3部分组成:(1)类声明的头文件(.h)。(2)类实现文件(.cpp)包含类成员函数的定义。(3)类的使用文件(.cpp)即主函数文件。

4、 构造函数

    构造函数主要用于在定义对象时,完成对象的初始化.

    每一个类都应该有一个构造函数,如果用户没有定义构造函数,编译器会自动生成构造函数(参数和函数体为空的构造函数),如果用户自定义了构造函数,那么编译器不再提供默认的构造函数。

    特性:1.构造函数的名称必须要与当前类的名称相同。

          2.构造函数仅在定义对象时由系统调用,其他时间无法调用。而且只执行一次。

          3.构造函数可以有参数,也可以没有参数,但是不允许有返回值。

          4.构造函数只能定义为公有成员,不能定义为其他。

    调用条件:1.定义对象时。2.为对象分配动态内存时。3.定义无名对象(稍作了解)

注意:(1)构造函数可以进行重载,以便用于不同形式的对象的定义。(2)构造函数还可以使用默认的缺省参数。如果构造函数既有重载,又有缺省参数时,注意不要产生二义性。

参数初始化表:

除了构造函数进行对成员数据进行初始化,还有参数初始化表对数据初始化,在函数首部实现。

例如:BOX::BOX(int h,int w,int len):height(h),width(w),length(len){}

类名::构造函数名([参数表])[:成员初始化表]

{[构造函数体]}

如果数据成员是数组,则需要在构造函数的函数体内用语句对其复制,不能再参数初始化表中进行对其初始化。

构造函数的重载:

在一个类中定义多个构造函数名具有相同的名字,而参数的个数或者参数的类型不同。

5、 析构函数

    析构函数是一种特殊的成员函数,完成与构造函数相反的工作,对象退出生命周期时,完成清理的工作。如:释放内存等。

    特性:

    1.析构函数的名称与类的名称相同。为了区分,析构函数名字前面有~

        构造:stu(){}       析构:~stu(){}

    2.析构函数无参、无返回值。

    3.析构函数不可重载。每一个类有且只有一个析构函数,但是可以有多个构造函数。

    4.在对象退出生命周期时,编译器会自动调用析构函数。但是,可以人为调用析构函数,不过没意义。

    5.一般情况下,使用系统默认的析构函数就可以。当类中有动态内存分配时,需要增加自定义的析构函数,否则有可能会导致内存泄露。

    调用条件:

        1.对象退出生命周期时。定义的对象在调用结束后释放时自动执行析构函数。

        2.释放动态分配的对象空间。使用new运算符动态的建立了一个对象,当使用delete运算符释放该对象时,先调用该对象的析构函数。

3.定义的全局的对象在程序离开其作用域的时候调用该全局对象的析构函数。

4.静态(static)局部对象在程序调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。

6、 析构顺序

同一作用域下,先构造的后析构。即最先被调用构造函数,其对应的析构函数最后被调用。先进后出。

调用析构函数的顺序与存储类别有关。

7、this指针:

指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。This指针是隐式使用的,它是作为参数被传递给成员函数的。

8、常对象:

类名 const 对象名[(实参表)]     或者     Const 类名 对象名[(实参表)]

在定义的时候必须初始化,如果一个对象声明为常对象,只能调用该对象的常成员函数,而不能调用其他的一般成员函数。常成员函数是常对象的唯一对外接口。常成员函数可以访问常对象中的数据成员,但是不允许修改对象中数据的值。但是一般的成员函数可以引用类中的非const数据成员也可以改变他们。

9、常对象成员

常对象的数据成员都是常数据成员,必须通过构造函数的参数初始化表对常数据成员进行初始化。

Const int hour;

Time::Time(int h):hour(h){}

常成员函数:可以访问常对象中的数据成员,但是不允许修改对象中数据的值。

类型名 函数名(参数表) const;

10、 指向常对象的指针变量

Const 类型名 * 指针变量名

如果一个变量声明为常变量,只能用指向常变量的指针向量指向它。

指向常变量的指针变量除了可以指向常变量外,也可以指向未被声明为const的变量,但是不可通过该指针变量改变变量的值。

当希望在调用函数时,对象的值不被修改,就应当把形参定义为指向常变量的指针变量,同时用对象的地址作为实参(对象可以是const或者非const型的)如果要求该对象不仅在调用函数的时候不被改变,而且要求它在程序执行的过程都不被调用,则需要把对象也定义为const型。

Time const t;             t是一个常对象,其值在任何情况下都不能改变。

Void Time::fun() const;    fun是Time类中的常成员函数,可以引用,但是不能改变本类中的数据成员。

Time *const p;           p是指向Time类对象的常指针变量,p的值不能改变。

Const Time *p;           p是指向Time类对象的指针变量,P指向的类对象的值不可以通过p来改变。

Const Time &t1=t;        t1是Time 类对象t的引用,二者指向同一个存储空间,t的值不能改变。

11、 对象的动态建立与释放

在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了简便而功能较强的运算符new和delete来取代malloc和free函数。

注意: new和delete是运算符,不是函数,因此执行效率高。

用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL(0值),用户可以根据该指针的值判断分配空间是否成功。

Box *pt;  //定义一个指向Box类对象的指针变量pt
pt=new Box;  //在pt中存放了新建对象的起始地址

delete 指针名; 如果被删除的是普通变量,则会直接释放动态分配的内存。如果被删除的是对象,则该对象的析构函数被调用。这里要注意一

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

「已注销」

LHStudio感谢您的支持

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

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

打赏作者

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

抵扣说明:

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

余额充值