一般情况下,按照c++面向对象象的要求,把类中的数据成员(属性)定义为____权限,而把成员函数(方法)定

(1) 类 定 义 中 关 键 字 private 、 public 和 protected 以后的成员嘚访问权限分别是私有、公 有和保护如果没有使用关键字,则所有成员默认 定义为 private 权限。具有 public 访问权限的数 据成员才能被不属于该类的函數所直接访问 (2) 定义成员函数时,运算符“∷”是作用域运 算符, “ MyClass ∷”用于表明其后的成员函数是在 “ MyClass 类”中说明的。

(3) 在程序运行时,通过为對象分配内存来创建 对象在创建对象时,使用类作为样板,故称对象 为类的实例。

创建 10个数组元素需调用构造函数 10次,创建对 象 b 需调用构造函數 1次,所以系统自动调用该类 构造函数的总次数为 11

(5) 对于任意一个类, 析构函数的个数最多为 1个。

(6) delete运算符通常用于实现释放该类对象 中指针成員所指向的动态存储空间的任务

(7) C++程序的内存格局通常分为 4个区:数 据区、代码区、栈区和堆区。

(8) 数据定义为全局变量,破坏了数据的 封装 性; 較好的解决办法是将所要共享的数据定义为 类的 静态成员

(9) 静态数据成员和静态成员函数可由 任意访 问权限许可的函数访问。

(10) 友元函数和 伖元类统称为友元 (11) 友元的正确使用能提高程序的效率,但破 坏了类的封装性和数据的隐蔽性。

二、 选择题(至少选一个,可以多选)

(1) 以下不属于類访问权限的是( B )

A. 类是一种用户自定义的数据类型 B. 只有类的成员函数才能访问类的私有数据成员

C. 在类中,如不做权限说明,所有的数据成员都 昰公有的

D. 在类中,如不做权限说明,所有的数据成员都 是私有的

类是一种用户自定义的数据类型,类中成员均具有 一种访问权限。关键字 public 、 protected 和 private 以後的成员的访问权限分别是公有、保护 和私有的,所有成员默认定义为 private 的 私有成员是被隐藏的数据,只有该类的成员函数或 友元函数才可以訪问它。

(3) 在类定义的外部,可以被任意函数访问的 成员有( C )

类是一种用户自定义的数据类型,类中成员均具有 一种访问权限。公有成员定义了類的外部接口私 有成员是被隐藏的数据,只有该类的成员函数或友 元函数才可以引用它。保护成员具有公有成员和私 有成员的双重性质,可鉯被该类或派生类的成员函 数或友元函数引用可见在类定义的外部,可以被 任意函数访问的成员是 public 的类成员。

(4) 关于类和对象的说法( C )是错误嘚

A. 对象是类的一个实例

B. 任何一个对象只能属于一个具体的类

C. 一个类只能有一个对象

D. 类与对象的关系和数据类型与变量的关系相似 【结果汾析】

C++语言的类就是一种用户自己定义的数据类型, 类和对象的关系就相当于基本数据类型与它的变 量的关系,所以任何一个对象只能属于一個具体的 类,但一个类可以有多个对象。

(6) 关于成员函数的说法中不正确的是 ( C ) A. 成员函数可以无返回值

B. 成员函数可以重载 C. 成员函数一定是内联函数 D. 成员函数可以设定参数的默认值 【结果分析】

与普通函数不同的是,成员函数是属于某个类的。 成员函数的实现,可以放在类体内,也可以放在类 体外在类体外实现的成员函数不再是内联函数。 (7) 下面对构造函数的不正确描述是( B ) A. 系统可以提供默认的构造函数

B. 构造函数可以有參数,所以也可以有返回值 C. 构造函数可以重载 D. 构造函数可以设臵默认参数 【结果分析】

构造函数不能指定返回类型,即使是 void 类型也 不可以,当然鈈可能有返回值。

声明指针是不会调用构造函数的

(9) 下面对析构函数的正确描述是( AC ) 。 A. 系统可以提供默认的析构函数 B. 析构函数必须由用户定義 C. 析构函数没有参数 D. 析构函数可以设臵默认参数 【结果分析】

析构函数的作用是在对象消失时执行一项清理任 务如果一个类中没有定义析构函数,系统将自动 生成一个默认析构函数。析构函数没有参数,当然 不可能设臵默认参数

(10) 类的析构函数是( D )时被调用的。 A. 类创建 B. 创建对象 C. 引用对象 D. 释放对象

(11) 创建一个类的对象时, 系统自动调用 ( B ) ; 撤销对象时,系统自动调用( C )

A. 成员函数 B. 构造函数 C. 析构函数 D. 复制构造函数

(12) 通常拷贝构造函數的参数是( C ) 。 A. 某个对象名 B. 某个 对象的成员名

C. 某个对象的引用名 D. 某个 对象的指针名

A. this指针必须显式说明 B. 当创建一个对象后, this 指针就指向该对象

C. 成員函数拥有 this 指针 D. 静态成员函数拥有 this 指针 【结果分析】

this 指针是由 C++编译器自动产生且较常用的一个 隐含对象指针,它不能被显式声明。当创建┅个对 象时, this 指针就初始化指向该对象 但只有非静 态成员函数才拥有 this 指针,并通过该指针来处 理对象。

(14) 下列关于子对象的描述中, ( B )是错误 的

A. 孓对象是类的一种数据成员,它是另一个类的 对象

B. 子对象可以是自身类的对象

C. 对子对象的初始化要包含在该类的构造函数中 D. 一个类中能含有哆个子对象作其成员 【结果分析】

子对象不可以是自身类的对象。

A. 它可以动态创建对象和对象数组 B. 用它创建对象数组时必须指定初始值 C. 用咜创建对象时要调用构造函数

D. 用它创建的对象数组可以使用运算符 delete 来 一次释放 【结果分析】

使用运算符 new 创建对象数组的格式如下:

其中, <算术表达式 >给出数组的大小,后面不能再 跟构造函数参数,所以用它创建对象数组时不能指

A. 用它可以释放用 new 运算符创建的对象和对象 数组

B. 用它释放┅个对象时,它作用于一个 new 所返 回的指针

C. 用它释放一个对象数组时,它作用的指针名前 须加下标运算符[ ]

D. 用它可一次释放用 new 运算符创建的多个对潒 【结果分析】

用 delete 一次只能释放用 new 创建的 1个对象, 但可释放一个对象数组

(17) 关于静态数据成员,下面叙述不正确的是 ( C ) 。

A. 使用静态数据成员,实际仩是为了消除全局变 量

B. 可以使用“对象名 . 静态成员”或者“类名∷ 静态成员”来访问静态数据成员

C. 静态数据成员只能在静态成员函数中引鼡

D. 所有对象的静态数据成员占用同一内存单元 【结果分析】

静态数据成员可以在静态成员函数中引用,也可以 在非静态成员函数中引用

(18) 对靜态数据成员的不正确描述是( CD ) 。

A. 静态成员不属于对象,是类的共享成员

B. 静态数据成员要在类外定义和初始化

C. 调用静态成员函数时要通过类或對象激活,所 以静态成员函数拥有 this 指针

D. 只有静态成员函数可以操作静态数据成员 【结果分析】

this 指针是一个局部量, 局部于某个对象, 而静态 成员函数是属于整个类而不是某个对象,它没有 this 指针 静态成员函数和非静态成员函数均可操 作静态数据成员。

(19) 下面的选项中,静态成员函数不能矗接访 问的是( D )

A. 静态数据成员 B. 静态 成员函数

C. 类以外的函数和数据 D. 非静 态数据成员

由于静态成员函数没有 this 指针,它只能直接访 问该类的静态数據成员、静态成员函数和类以外的 函数和数据,访问类中的非静态数据成员必须通过 参数传递方式得到对象名,然后通过对象名来访 问。

(20) 在类嘚定义中, 引入友元的原因是 ( A ) A. 提高效率 B. 深化 使用类的封装性

C. 提高程序的可读性 D. 提高 数据的隐蔽性

友元的作用主要是为了提高效率和方便编程,但友 元破坏了类的封装性和隐蔽性,使用时要权衡利 弊。

(22) 下面对友元的错误描述是( D )

B. 一个类中的成员函数可以是另一个类的友元

C. 友元函数訪问对象的成员不受访问特性影响

D. 友元函数通过 this 指针访问对象成员

友元函数是一个放在类中的普通函数, 它没有 this 指针。

(23) 下面选项中, ( C )不是类的荿员函数 A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数

(1) 类与对象有什么关系?

类是一种用户自己定义的数据类型,和其他数据类 型不同的是,组成這种类型的不仅可以有数据,而 且可以有对数据进行操作的函数。程序员可以使用 这个新类型在程序中声明新的变量,具有类类型的 变量称为對象创建对象时,类被用做样板,对象 称为类的实例。

(2) 类定义的一般形式是什么?其成员有哪几种 访问权限?

(3) 类的实例化是指创建类的对象还是萣义类? 【问题解答】

(4) 什么是 this 指针?它的主要作用是什么? 【问题解答】

this 指针是 C++语言为成员函数提供的一个隐含对 象指针, 它不能被显式声明 this 指針是一个局部 量,局部于某个对象。不同的对象调用同一个成员 函数时,编译器根据 this 指针来确定应该引用哪 一个对象的数据成员

(5) 什么叫做拷貝构造函数?拷贝构造函数何时 被调用?

拷贝构造函数是一种特殊的构造函数,它的作用是 用一个已经存在的对象去初始化另一个对象。为了 保證所引用的对象不被修改,通常把引用参数声明 为 const 参数

在以下 3种情况下, 拷贝构造函数都会被自动调用:◆当用类的一个对象去初始化该类的叧一个对象 时;

◆当函数的形参是类的对象,进行形参和实参结合 时;

◆当函数的返回值是类的对象,函数执行完成返回 调用者时。

四、 程序分析題(写出程序的输出结果,并分析 结果)

本题主要考查构造函数的调用时机和构造函数的 匹配问题

构造函数在创建对象时被自动调用,具体调用哪个 构造函数将由编译系统根据重载函数的匹配原则 来确定。

① 程序声明了 2个对象 x 和 y , 类中有 2个构造函 数

② 程序首先执行语句 1,创建对象 x ,调鼡默认构 造函数。由于对象 x 是对象数组,每个数组元素被 创建时都要调用构造函数,所以默认构造函数被调 用了 2次,输出第 1、 2行结果程序接着執行语 句 2,创建对象 y ,调用带一个参数的构造函数, 输出第 3行结果。

本题主要考查析构函数的调用时机

析构函数在释放对象时被自动调用。

① 程序声明了一个对象 w

② 程序首先执行语句 1,创建对象 w ,调用构造函 数, num 得到初值 5。程序接着执行语句 2, 输出第 1行结果当程序结束时,释放对象 w ,析構函数 被调用,输出第 2行结果。

(3) 将例 3.10中的 Whole 类如下修改,其他部 分不变,写出输出结果

本题主要考查“在类的范围内所有对象共享静态成 员的数據”的含义。

}

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

此份笔记建议在完整阅读郑莉老師、董渊老师、何江舟老师所编写的《C++语言程序设计(第4版)》后食用风味更佳!
最后,由于本人水平有限笔记中仍存在错误但还没囿被检查出来的地方,欢迎大家批评与指正


4.1 c++面向对象象程序设计的特点

??c++面向对象象方法中的抽象,是指对具体问题(对象)进行概括抽出一类对象的公共性质井加以描述的过程。

2.对一个问题的抽象包括

??描述某类对象的属性或状态也就是此类对象区别于彼类对潒的特征

??后者描述的是某类对象的共同行为或功能特征。

??封装就是将抽象得到的数据和行为(或功能)相结合形成一个有机的整体,也就是将数据与操作数据的函数代码进行有机的结合形成“类",其中的数据和函数都是类的成员

??通过封装使一部分成员充当类与外部的接口,而将其他成员隐蔽起来这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度进洏增强数据的安全性和简化程序编写工作。

??如何把特殊与一般的概念间的关系描述清楚使得特殊概念之间既能共享一般的属性和行為,又能具有特殊的属性和行为呢

??只有继承,才可以在一般概念基础上派生出特殊概念,使得一般概念中的属性和行为可以被特殊概念共享摆脱重复分析、重复开发的困境。

??C++语言中提供了类的继承机制允许程序员在保持原有类特性的基础上,进行更具体、哽详细的说明通过类的这种层次结构,可以很好地反映出特殊概念与一般概念的关系

??从广义上说,多态性是指一段程序能够处理哆种类型对象的能力


类是c++面向对象象程序设计方法的核心,利用类可以实现对数据的封装和隐蔽

在面向过程的结构化程序设计中,程序的模块是由函数构成的函数将逻辑上相关的语句与数据封装,用于完成特定的功能

在c++面向对象象程序设计中,程序模块是由类构成嘚类是对逻辑上相关的函数与数据的封装,它是对问题的抽象描述

  • 在类中可以只声明函数的原型,函数的实现(即函数体)可以在类外定义
  • 在书写时通常习惯将公有类型放在最前面这样便于阅读,因为它们是外部访问时所要了解的

4.2.2 类成员的访问控制

  • 数据成员:描述問题的属性
  • 函数成员:描述问题的行为

??定义了类的外部接口,任何外部函数都可以访问公有类型数据和函数

??私有成员只能被本類的成员函数访问,来自类外部的任何访问都是非法的

??一般情况下,一个类的数据成员都应该声明为私有成员这样,内部数据结構就不会对该类以外的其余部分造成影响程序模块之间的相互作用就被降低到最小。

??保护类型成员的性质和私有成员的性质相似其差别在千继承过程中对产生的新类影响不同。

  • 在类的定义中具有不同访问属性的成员,可以按任意顺序出现修饰访问属性的关键字吔可以多次出现。但是一个成员只能具有一种访问属性
  • 如果紧跟在类名称的后面声明私有成员,则关键字private可以省略

C++中,类的对象就是該类的某一特定实体

  • 对象所占据的内存空间只是用于存放数据成员函数成员不在每一个对象中存储副本,每个函数的代码在内存中只占據一份空间
2.从对象访问数据成员
3.从对象名访问函数成员
对象名.函数成员名(参数表)
返回值类型 类名::函数成员名(参数表)
  • 函数的原型声明要写茬类体中,原型说明了函数的参数表和返回值类型
  • 而函数的具体实现是写在类定义之外的。

3.带默认形参值的成员函数
  • 类成员函数的默认徝一定要写在类定义中,而不能写在类定义之外的函数实现中

下面所讲的不只针对类的成员函数,对C++的函数都适用

  • 如果一个函数在定義之前又有原型声明默认形参值需要在原型声明中给出,定义中不能再出现默认形参值

??如果有的函数成员需要被频繁调用 ,而且玳码比较简单这个函数也可以定义为内联函数。

(1)隐式声明:将函数体直接放在类体内

(2)显示声明:在函数体实现时,在函数返囙值类型前加上inline类定义中不加入showTime的函数体。


4.3 构造函数与析构函数

??在对象被创建时利用特定的值构造对象将对象初始化为一个特定嘚状态。

  • 构造函数也是类的一个成员函数具有一般成员函数的特征
  • 构造函数的函数名与类名相同,而且没有返回值;
  • 构造函数通常被声奣为公有函数
  • 构造函数在对象被创建的时候将被自动调用

??调用时无需提供参数的构造函数成为默认构造函数。

  • 如果类中没有写构造函数编译器会自动生成一个隐含的默认构造函数,该构造函数的参数列表和函数体皆为空
  • 如果类中声明了构造函数(无论是否有参数),编译器便不会再为之生成隐含的构造函数
4.作为类的成员函数,构造函数可以直接访问类的所有数据成员可以是内联函数,可以带囿参数表可以带默认的形参值,也可以重载
1.什么是复制构造函数
  • 复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性;
  • 其形参是本类的对象的引用;
  • 其作用是使用一个已经存在的对象(由复制构造函数的参数指定)去初始化同类的一个新对象。
  • 如果程序员没有定义类的复制构造函数系统就会在必要时自动生成一个隐含的复制构造函数。
  • 这个隐含的复制构造函数的功能是把初始值对潒的每个数据成员的值都复制到新建立的对象中。
类名(类名 &对象名); 类名::类名(类名 &对象名)
4.复制构造函数被调用的三种情况

(1)当用類的一个对象去初始化该类的另一个对象时

(2)如果函数的形参是类的对象,调用函数时进行形参和实参结合时。

  • 只有把对象用值传遞时才会调用复制构造函数,如果传递引用则不会调用复制构造函数。由于这一原因传递比较大的对象时,传递引用会比传值的效率高很多

(3)如果函数的返回值是类的对象,函数执行完成返回调用者时

5.需要注意(浅拷贝与深拷贝)
  • 深拷贝和浅拷贝可以简单理解為:如果一个类拥有资源,当这个类的对象发生复制过程的时候资源重新分配,这个过程就是深拷贝反之,没有重新分配资源就是淺拷贝。
  • 在对含有指针成员的对象进行拷贝时必须要自己定义拷贝构造函数,使拷贝后的对象指针成员有自己的内存空间即进行深拷貝,这样就避免了内存泄漏发生
  • 总结:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间深拷贝不但对指针进行拷贝,洏且对指针指向的内容进行拷贝经深拷贝后的指针是指向两个不同地址的指针。**

??当类的数据成员中有指针类型时默认的复制构造函数实现的只能是浅复制。浅复制会带来数据安全方面的隐患要实现正确的复制,也就是深复制必须编写复制构造函数。

??析构函數与构造函数的作用几乎正好相反它用来完成对象被删除前的一些清理工作,也就是专门做扫尾工作的例如:释放之前动态申请的内存。

  • 析构函数是在对象的生存期即将结束的时刻被自动调用的
  • 与构造函数一样,析构函数通常也是类的一个公有函数成员它的名称是甴类名前面加“~”构成,没有返回值
  • 和构造函数不同的是析构函数不接收任何参数,但可以是虚函数
  • 如果不进行显式说明,系统也会苼成一个函数体为空的隐含析构函数

??类的组合描述的就是一个类内嵌其他类的对象作为成员的情况,它们之间的关系是 一种包含与被包含的关系

 类名::类名(参数表):内嵌对象1(参数表),内嵌对象2(参数表),内嵌对象3(参数表),···

数据成员也可采用如上初始化方式

 类名::类名(参数表):数據成员1(参数表),数据成员2(参数表),数据成员3(参数表),···
4.组合类构造函数的调用顺序

(1)调用内嵌对象的构造函数,调用顺序按照内嵌对象在组匼类的定义中出现的次序;

  • 内嵌对象在构造函数的初始化列表中出现的顺序与内嵌对象构造函数的调用顺序无关

(2)执行组合类构造函數的函数体。

5.组合类析构函数的调用顺序

??析构函数的调用执行顺序与构造函数刚好相反

(1)先执行组合类析构函数的函数体;

(2)內嵌对象的析构函数被一一执行,执行顺序与它们在组合类的定义中出现的次序相反

1.什么是前向应用声明

??前向引用声明,是在引用未定义的类之前将该类的名字告诉编译器,使编译器知道那是一个类名

正确的姿势(使用前向引用声明)

??使用前向引用声明虽然鈳以解决一些问题,但它并不是万能的需要注意的是,尽管使用了前向引用声明但是在提供一个完整的类定义之前,不能定义该类的對象也不能在内联成员函数中使用该类的对象。



1.什么是结构体(C++中)

??结构体是一种特殊形态的类它和类一样,可以有自己的数据荿员和函数成员可以有自己的构造函数和析构函数,可以控制访问权限可以继承,支持包含多态等二者定义的语法形式也几乎一样。

2.问题来了——结构体与类的区别

??结构体和类的唯一区别在于结构体和类具有不同的默认访问控制属性:

  • 在类中,对于未指定访问控制属性的成员其访问控制属性为私有类型;
  • 在结构体中,对于未指定任何访问控制属性的成员其访问控制属性为公有类型。
  • 在结构體的定义中如果把公有成员放在最前面,则最前面的"public" 可以省去
  • 与类不同,对于结构体人们习惯于将数据成员设置为公共的。
4.思考:為什么C++还要引入结构体
  • 为了保持和C程序的兼容性。
  • C 语言只有结构体而没有类,C 语言的结构体中只允许定义数据成员不允许定义函数荿员,而且C语言没有访问控制属性的概念结构体的全部成员是公有的。C语言的结构体是为面向过程的程序服务的并不能满足c++面向对象潒程序设计的要求。
  • C ++ 在 struct 之外引入了另外的关键字 class ,并且把它作为定义抽象数据类型的首选关键字
  • 但为了保持和 C 程序的兼容,C++ 保留了 struct 关键字并规定结构体的默认访间控制权限为公有类型。

??联合体的全部数据成员共享同一组内存单元

联合体Mark类型变量的存储结构:

  • 由于联合體的成员共用相同的内存单元联合体变量中的成员同时至多只有一个是有意义的。
  • 联合体的各个对象成员不能有自定义的构造函数、洎定义的析构函数和重载的复制赋值运算符,不仅联合体的对象成员不能有这些函数这些对象成员的对象成员也不能有,以此类推
  • 联匼体不能继承,因而也不支持包含多态
  • 一般只用联合体来存储一些公有数据,而不为它定义函数成员
  • 联合体也可以不声明名称。
  • 无名聯合体没有标记名只是声明一个成员项的集合,这些成员项具有相同的内存地址可以由成员项的名字直接访问。
  • 无名联合体通常用作類或结构体的内嵌成员
}

我要回帖

更多关于 c++面向对象 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信