`
bsr1983
  • 浏览: 1117576 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第五章 特殊函数和成员

 
阅读更多

第五章 特殊函数和成员

5.1 对象成员的初始化

可以在一个类中说明具有某个类的类型的数据成员,这些成员成为对象成员。在类A中说明对象成员的一般形式如下:

class A 

{

类名1 成员名1;

类名2 成员名2;

……

类名 成员名n;

};

说明对象成员是在类名之后给出对象成员的名字。为初始化对象成员,A类的构造函数要调用这些对象成员所在类的构造函数,A类的构造函数的定义形式如下:

A::A(参数表0):成员1(参数表1),成员2(参数表2),成员n(参数表n

{//其他操作}

冒号“:”后由逗号隔开的项目组成员初始化列表,其中的参数表给出了为调用相应成员所在类的构造函数时应提供的参数。参数列表中的参数都来自“参数表0”,可以使用任意复杂的表达式,其中可以有函数调用。如果初始化列表某项的参数表为空,则列表中相应的项可以省略。

对象成员构造函数的顺序取决于这些对象成员在类中说明的顺序,与他们在成员初始化列表中给出的顺序无关。析构函数的调用顺序与构造函数正好相反。

5.2 静态成员

简单成员函数是指声明中不含constvalatilestatic关键字的函数。如果类的数据成员或成员函数使用关键字static进行修饰,这样的成员称为静态数据成员或静态成员函数,统称为静态成员。

静态数据成员只能说明一次,如果在类中仅对静态数据成员进行声明,则必须在文件作用域的某个地方进行定义。在进行初始化之前,必须进行成员名限定。

注意:由于static不是函数中的一部分,所以在类声明之外定义静态成员函数时,不使用static。在类中定义的静态成员函数是内联的。

类中的任何成员函数都可以访问静态成员。因为静态成员函数没有this指针,所以静态成员函数只能通过对象名(或指向对象的指针)访问该对象的非静态成员。

静态成员函数与一般函数有如下不同:

(1)可以不指向某个具体的对象,只与类名连用。

(2)在没有建立对象之前,静态成员就已经存在。

(3)静态成员是类的成员,不是对象的成员。

(4)静态成员为该类的所有对象共享,它们被存储于一个公用的内存中。

(5)没有this指针,所以除非显式地把指针传给它们,否则不能存取类的数据成员。

(6)静态成员函数不能说明为虚函数。

(7)静态成员函数不能直接访问非静态函数。

静态对象具有如下性质:

(1)构造函数在代码执行过程中,第一次遇到它的时候变量定义时被调用,但直到整个程序结束之前仅调用一次。

(2)析构函数在整个程序退出之前被调用,同样也只调用一次。

5.3 友元函数

有时两个概念上相近的类要求其中一个类可以无限制地存取另一个类的成员。

友元函数解决了这类难题。友元函数可以存取私有成员、公有成员和保护成员。其实,友元函数可以是一个类或函数,尚未定义的类也可以作为友元引用。

1.类本身的友元函数

为本类声明一个友元函数,这时,虽然在类中说明它,但它并不是类的成员函数,所以可以在类外面像普通函数那样定义这个函数。

虽然友元函数是在类中说明的,但函数的定义一般在类之外,作用域的开始点在它的说明点,结束点和类的作用域相同。

友元说明可以出现于类的私有或公有部分。因为友元说明也必须出现于类中,所以应将友元看作类的接口的一部分。使用它的主要目的是提高程序效率。友元函数可以直接访问类对象的私有程序,因而省去调用类成员函数的开销。它的另一个优点是:类的设计者不必在考虑号该类的各种可能使用情况之后再设计这个类,而可以根据需要,通过使用友元增加类的接口。但使用友元的主要问题是:它允许友元函数访问对象的私有成员,这破坏了封装和数据隐藏,导致程序的可维护性变差,因此在使用友元时必须权衡得失。

注意:友元函数可以在类中声明时定义。如果在类外定义,不能再使用friend关键字。

2.将成员函数用作友元

一个类的成员函数(包括构造函数和析构函数)可以通过使用friend说明为另一个类的友元。

3.将一个类说明为另一个类的友元

可以将一个类说明为另一个类的友元。这时,整个类的成员函数均具有友元函数的性能。声明友元关系简化为“friend class 类名;”

需要注意的是,友元关系是不传递的,即当说明类A是类B的友元,类B又是类C的友元时,类A却不是类C的友元。这种友元关系也不具有交换性,即当说明类A是类B的友元时,类B不一定是类A的友元。

当一个类要和另一个类协同工作时,使一个类称为另一个类的友元是很有用的。

友元声明与访问控制无关。友元声明在私有区域进行或在公有区域进行是没有太大区别的。虽然友元函数的声明可以置于任何部分,但通常置于能强调其功能的地方以使其直观。对友元函数声明的惟一限制是该函数必须出现在类声明内的某一部分。

5.4 const对象

可以在类中使用const关键字定义数据成员和成员函数或修饰一个对象。一个const对象只能访问const成员函数,否则将产生编译错误。

1.常量成员

常量成员包括常量数据成员、静态常数据成员和常引用。静态常数据成员仍保留静态成员特征,需要在类外初始化。常数据成员和常引用只能通过初始化列表来获得初值。

2.常引用作为函数参数

使用引用作为参数,传送的是地址。但有时仅希望将参数的值提供给函数使用,并不允许函数改变对象的值,这时可以使用常引用作为参数。

3.常对象

在对象名前使用const声明常量对象,但声明时必须同时进行初始化,而且不能被更新。定义的语法如下:

类名 const 对象名(参数表);

4.常成员函数

可以声明一个成员函数为const函数。一个const对象可以调用const函数,但不能调用非const成员函数。const放在函数声明之前意味着返回值是常量,但这不符合语法。必须将关键字const放在参数列表之后,才能说明该函数是一个const成员函数。声明常成员函数的格式如下:

类型标识符 函数名(参数列表) const;

为了保证不仅声明const成员函数,而且确实也定义为const函数,程序员在定义函数时必须重申const声明。也就是说,const已经成为这种成员函数识别符的一部分,编译器和连接程序都要检查const。定义格式如下:

类型标识符 类名::函数名(参数列表)const{//函数体}

const位于函数参数表之后,函数体之前。也可以在类中用内联函数定义const函数。

类型标识符 函数名(参数列表)const{//函数体}

在定义成员函数时,函数体之前加上const可以防止覆盖函数改变数据成员的值。

在常成员函数里,不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。如果将一个对象说明为常对象,则通过该对象只能调用它的const成员函数,不能调用其他成员函数。

注意:用const声明static成员函数没有什么作用。在C++中声明构造函数和析构函数时使用const关键字均是非法的,但有些C++的编译程序并不给出出错信息。volatile关键字的使用方法与const类似,但因其很少用,此处不介绍。

5.5 数组和类

编译器调用适当的构造函数建立数组的每一个分量。如果找不到合适的构造函数,则产生错误信息。

5.6 指向类成员函数的指针

对象是一个完整的实体。为了支持这一封装,C++包含了指向类成员的指针。可以用普通指针访问内存中给定类型的任何对象,指向类成员的指针则用来访问某个特定类的对象中给定类型的任何成员。

C++既包含指向类数据成员函数的指针,又包含指向成员函数的指针。他提供一种特殊的指针类型,指针指向类的成员,而不是指向该类的一个对象中该成员的一个实例,这种指针称为指向类成员的指针。不过,指向类数据成员的指针要求数据成员是公有的,用途不大,所以不予介绍,仅简单介绍指向类成员函数的指针。

类并不是对象,但有时可将其视为对象来使用。可以声明并使用指向对象成员函数的指针。指向对象的指针是比较传统的指针,假设类A的成员函数为“void fa(void);”,如要建立一个指针pafn,它可以指向任何无参数和无返回值的类A的成员函数:

voidA::* pafn(void)

虽然“::”是作用域分辨符,但在这种情况下,“A::”最好读成“A的成员函数”,这时,从内往外看,此声明可读作:pafn是一个指针,指向类A的成员函数,此成员函数既无参数,也无返回值。下面的例子说明了pafn如何被赋值并用以调用函数fa

pafn=A::fa; //指向类A的成员函数fa的指针pafn

a x; //A的对象x

A *px=&x; //指向类A对象x的指针px

(x.*pafn)(); //调用类A的对象x的成员函数fa

(px->pafn)(); //调用类A的对象x的指针px指向的成员函数fa

指向类A中参数类型列表为list,返回类型为type的成员函数的指针声明形式如下:

typeA::* pointer)(list);

如果类A的成员函数fun的原型与pointer所指向的函数的原型一样,则语句

pointer=A::fun;

将该函数的地址(这个地址不是真实地址,而是在A类中所有对象的便宜)置给了pointer。在使用指向类成员函数的指针访问对象的某个成员函数时,必须指定一个对象。用对象名或引用调用pointer所指向的函数时,使用运算符“.*”,使用指向对象的指针调用pointer所指向的成员函数时,使用运算符“->*”。

5.7 求解一元二次方程

分享到:
评论

相关推荐

    第5章 函数的设计和使用.pptx

    以下是对"第5章 函数的设计和使用"内容的详细解读: 1. **函数的复用与一致性**: - 函数应被设计成能够重复执行的代码块,以实现代码复用。这样可以减少代码冗余,提高效率。 - 保证代码一致性,修改函数时,...

    Visual C++2008程序设计完全自学教程

    第5章 特殊类型变量——指针 第6章 函数提高程序模块化 第7章 预处理器和宏 第8章 自定义数据类型 第9章 对象和类 第10章 构造函数和类成员 第11章 类继承和友元关系  第12章 多态与虚拟函数 第13章 I/O与...

    C程序设计(第五版)课后答案-第九章

    《C程序设计(第五版)》是谭浩强教授的经典著作,对于学习C语言的初学者来说,是一本非常实用的教材。第九章通常会深入讲解C语言中的指针概念,这是C语言的一个核心特性,也是许多编程难题的解决关键。在这一章,...

    C 程序设计课件:第12章 构造函数.ppt

    第12章"构造函数"详细介绍了构造函数及其在类与对象中的应用。 首先,我们来理解类与对象的概念。类是对具有相同属性和行为的事物的一种抽象,它定义了一组数据成员(属性)和成员函数(行为)。对象则是类的具体...

    c#第五章c#第五章c#第五章

    在C#编程语言的学习过程中,第五章通常会深入讲解面向对象编程的核心概念和技术。面向对象编程(Object-Oriented Programming,OOP)是C#的基础,也是软件开发中的重要思维方式。这一章的内容可能会涵盖以下几个关键...

    c++primer第五版习题答案(第17章)

    C++中类的定义包括数据成员和成员函数。 通过完成第17章的习题,可以更深入地理解和掌握这些知识点,从而更好地使用C++进行高效的软件开发。在学习过程中,对答案的使用应持批判性思维,结合实际操作和教材内容,...

    我的第五章代码.7z

    在本压缩包“我的第五章代码.7z”中,包含的是C++编程语言的相关代码示例,主要用于学习和理解C++的第五章内容。C++是一种强大的、面向对象的编程语言,由Bjarne Stroustrup在C语言的基础上发展而来,具有高效、灵活...

    python详细学习教程.rar

    第五章:Python字符串常用方法 第六章:Python流程控制 第七章:函数和lambda表达式 第八章:Python类和对象 第九章:Python异常处理机制 第十章:类特殊成员 第十一章 Python模块和包 第十二章:Python常见模块 第...

    c++primer第五版第9章课后习题答案上

    以上是对《C++ Primer 第五版》第九章部分课后习题的分析,每个题目都对应了C++中的一个重要概念或技巧,旨在帮助学习者深入理解和熟练运用C++的高级特性。通过解答这些习题,学生可以巩固课堂所学,提升编程能力。

    C++及Windows可视化程序设计第5章.ppt

    C++及Windows可视化程序设计第5章 本章主要讲解了在C++中定义类、建立和使用对象的方法。类是对同类对象的描述,它不但描述了对象之间的公有接口,同时也给出了对象的内部实现(数据成员和成员函数)。类的定义形式...

    C++PrimerPlus第6版中文版第5章程序

    文件名列表中的"第5章程序"可能包含一系列示例代码,这些代码旨在帮助读者更好地理解和实践上述概念。通过实际编写和运行这些程序,你可以加深对C++类、对象、封装、继承的理解,并逐步掌握面向对象编程的思想。 总...

    C++ PRIMIER 第三章习题答案和代码

    《C++ Primer 第三章习题答案和代码》是一份针对C++初学者的重要资源,主要涵盖C++ Primer这本书第三章的学习内容。该资源包含了作者自己编写的代码以及对书中习题的解答,旨在帮助读者深入理解和应用所学知识。 在...

    Python学习教程(超级详细)中文PDF完整版最新版本

    目录第1章Python编程基础第2章Python初探第3章变量类型和运第4章列表、元组、字典和集合第5章Python字符串常用方法第6章Python 流程控制第7章函数和 lambda表达式第8章Python 类和对象第9章Python异常处理机制第10章...

    C++第五章 类和对象.ppt

    // 私有数据成员和成员函数 protected: // 保护数据成员和成员函数 public: // 公有数据成员和成员函数 }; ``` 5.1.2 类的成员函数 成员函数定义了类的行为,它们可以直接在类定义内部定义,也可以单独定义并在类...

    C++第五章_类与对象习题解答.docx

    【C++第五章_类与对象习题解答】 在C++编程语言中,类与对象是面向对象编程的基础。类是一种用户自定义的数据类型,它封装了数据(数据成员)和操作这些数据的方法(成员函数)。类的定义使用关键字"class",而成员...

    C++语言程序设计教程:第3章 类与对象.ppt

    本章主要介绍了C++语言中类与对象的概念,包括类的定义、实现、构造函数、析构函数、拷贝构造函数、友元函数和友元类、const成员和const对象、static成员、this关键字、对象数组、类组合关系等。 类的定义是声明一...

    离散数学第七章函数复习笔记.docx

    在离散数学中,函数是一种特殊的映射,它将一个集合的每个元素唯一地映射到另一个集合的元素上。以下是关于函数,特别是单射、满射和双射的详细解释。 首先,映射是数学中的基本概念,它描述了一个集合(称为定义域...

    C++课后作业及实验答案

    构造函数和析构函数是C++中的特殊成员函数。构造函数在对象被创建时被调用,用于初始化对象的成员变量。析构函数在对象被销毁时被调用,用于释放对象的资源。 在本资源中,experiment 4中展示了构造函数和析构函数...

    编程思想14章构造函数的初始化表达式

    使用初始化列表有几个优点:它避免了默认构造函数的调用,能更有效地初始化const成员和引用成员,并且可以确保数据成员按声明顺序初始化。 此外,构造函数也可以利用初始化表达式进行成员对象的构造。如果成员对象...

    JAVA OOP 第五章作业

    例如,在第五章的作业中,你可能被要求设计一个名为“学生”的类,包括姓名、年龄等属性以及获取和设置这些属性的方法。 2. 封装: 封装是面向对象编程的三大特性之一,它隐藏了对象的内部实现细节,只对外提供...

Global site tag (gtag.js) - Google Analytics