您好,欢迎访问三七文档
嵌入式Linux下QT程序设计主讲:成宝宗主要内容:This指针Static成员Const成员类的组合友元模板This指针this指针的使用:一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用return*this;另外一种情况是当参数与成员变量名相同时。如this-n=n(不能写成n=n)5静态成员静态成员用于解决同一个类的不同对象之间的数据和函数的共享问题。静态数据成员用关键字static声明该类的所有对象维护该成员的同一个拷贝必须在类外定义和初始化,用(::)来指明所属的类。静态成员函数类外代码可以使用类名和作用域操作符来调用静态成员函数。静态成员函数只能引用属于该类的静态数据成员或静态成员函数。32Const对象常对象使用const关键字声明的对象称为常对象。常对象的声明形式如下:const类名对象名或类名const对象名声明常对象的同时,也要进行初始化,而且该对象以后不能再被更新。Const成员函数常成员函数使用const关键字声明的函数称为常成员函数。常成员函数声明的形式如下:类型标识符函数名(参数表)const;说明:①const是加在函数声明后面的类型修饰符,它是函数类型的一个组成部分,因此,在实现部分也要带const关键字。②const关键字可以被用于对重载函数的区分。例如,可以在类中这样声明:voidfun();voidfun()const;③常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。④如果将一个对象说明为常对象,则通过该对象只能调用它的常成员函数,而不能调用其它成员函数。Const数据成员常数据成员使用关键字const不仅可以说明成员函数,还可以说明数据成员。如果在一个类中说明了常数据成员(包括常引用、常对象等),由于常数据成员不能被更新,因此,在类中说明常数据成员时,只能用成员初始化列表的方式通过构造函数对该数据成员进行初始化。类的组合ClassA{private:…public:…};其中,B类中的数据成员a就是一个A类的对象,称之为对象成员。在定义一个类时,其数据成员既可以是简单类型,又可以是自定义类型,还可以是类的对象。这样,我们定义类时,就可以利用已定义的类来构成新类,由若干结构简单、易于实现的类来构造复杂的类。这种类似于部件组装的方法,不仅简化了问题的描述,而且有利于提高软件的开发效率,也是软件复用的一种形式。ClassB{private:Aa;…public:…};对组合类,当创建该类的对象时,其中包含的各个对象成员也将被自动创建。故该类的构造函数应包含对其中对象成员的初始化。通常采用成员初始化列表的方法来初始化对象成员。在成员初始化列表中,既包含对对象成员的初始化,又包含对本类中其它的基本数据成员的初始化。类的组合类的组合#includeiostream.hclassA{private:inta1,a2;public:A(inti,intj){a1=i,a2=j;}voidprint(){couta1,a2endl;}};classB{private:Aa;intb;public:B(inti,intj,intk):a(i,j),b(k){}voidprint();};voidB::print(){a.print();coutbendl;}voidmain(){Bb(3,4,5);b.print();}在该程序中,B类中包含一个A类的对象a,它是一个对象成员。该程序执行后的输出结果为3,45请注意,B类的构造函数构成如下:B(inti,intj,intk):a(i,j),b(k){}其中,构造函数冒号后的部分a(i,j)、b(k)被称为成员初始化列表,该表列出了为初始化对象成员所使用的构造函数。当建立B类的对象时,对象成员a首先被建立。为构造该对象成员,所指定的构造函数(即A类对象的构造函数)被执行。B类对象的一般数据成员b也可用此方式初始化其值为k。类的组合事实上,当建立一个组合类对象时,它所包含的所有对象成员也一同被建立。当所有的对象成员被构造完毕之后(即它们所在类的构造函数被执行完),该对象的类的构造函数体才被执行。析构函数的执行顺序与构造函数刚好相反。另外要注意,各个成员对象的构造函数的调用次序与这些对象成员在类中的声明次序一致,而与成员初始化列表中给出的构造函数的次序无关。类的组合综上所述,下面给出组合类构造函数定义的一般形式:类名::类名(形参表):对象成员1(形参表),对象成员2(形参表),…{类的初始化程序体}其中,构造函数冒号后的部分:“对象成员1(形参表),对象成员2(形参表),…”称作成员初始化列表,用于完成对组合类中所包含的对象成员的初始化。该表列出了初始化各对象成员所使用的构造函数。当创建该组合类对象时,这些构造函数按在类中声明的次序依次被调用,将类中对象成员依次建立。最后,执行该类的构造函数体。至此,该组合类对象创建完毕。类的组合17友元在类组合中,B类中内嵌了A类的对象,B的成员函数无法直接访问A的私有成员。友元提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。也就是说,通过友元的方式,一个普通函数或者类的成员函数可以访问到封装于某一个类中的数据。这相当于给类的封装挖了一个小孔,通过它,外界可以看到类内部的一些属性。友元是C++提供的一种破坏数据封装和数据隐藏的机制。通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。可以使用友元函数和友元类。为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。友元函数如果友元是普通函数或类的成员函数,则称为友元函数。友元函数是在类声明中由关键字friend修饰的非成员函数。普通函数声明为友元函数的形式如下:friend类型标识符友元函数名(参数表)成员函数声明为友元函数的形式如下:friend类型标识符类名::友元函数名(参数表)说明:①友元函数的声明可以在类声明中的任何位置,既可在public区,也可在protected区,意义完全一样。②友元函数的定义一般放在类的外部,最好与类的其它成员函数定义放在一起。如果是普通函数作为友元,也可以放在类中。友元函数不是本类的成员函数,但是它可以通过对象名访问类的所有成员,包括私有和保护成员。21友元类如果友元是一个类,则称为友元类。友元类的声明形式如下:friendclass友元类名说明:①友元类的声明同样可以在类声明中的任何位置。②友元类的所有成员函数都成为友元函数。例如,若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。注:友元关系是单向的。类模板模板是C++支持参数化多态性的工具。所谓参数化多态性,就是将一段程序所处理的对象的类型参数化,使得这段程序可以用于处理多种不同类型的对象,从而实现了代码复用——C++最重要的特性之一。由于C++程序结构的主要构件是类和函数,所以,模板在C++中有类模板和函数模板两种。类模板使我们在声明一个类时,能够将实现这个类所需要的某些数据类型(包括类中数据成员的类型、成员函数的参数的类型或其返回值的类型)参数化,使之成为一个可以处理多种类型数据的通用类。而在创建类对象时,通过指定参数所代表的实际数据类型,将通用类实例化。所建立的实例类是通用类的一个副本,但是它具有指定的类型。类模板当一个类表示像数组、链表、矩阵等这类数据结构或包含有通用的逻辑算法时,类模板变得非常有用。因为这些数据结构的表示和算法的选择不受其所包含的元素的数据类型的影响。例如,维护一个整数队列的算法同样适用于维护字符队列。因此,可以通过定义一个类模板,创建一个可以维护队列的类,队列中的元素可以是任意数据类型。在声明该类的具体对象时,编译器会根据指定的数据类型自动产生该类的实例。类模板声明类模板的一般形式如下:templateclassTtypeclassclass_name{…}其中,Ttype是一个标识符,代表所声明的类模板中参数化的类型名。当实例化该通用类时,将由一个具体的类型代替它。若有多个参数化的类型名,可将它们依次罗列,用逗号隔开。类模板可以看到,类模板的声明与通常的类定义没什么不同,只是以如下的首部开头:template模板参数表上述首部表明,这是一个类模板的定义。模板参数表由参数化的形式类型名组成,可以包含下列内容。-class标识符其中,标识符即为形式类型名,代表参数化的类型名。-类型说明符标识符该标识符可以接受一个常量作为参数,常量的类型由“类型说明符”指定。类模板注意,模板类的成员函数必须是函数模板。一旦定义了类模板,就可以用如下的语句创建这个类的实例:class_nametype对象1,…,对象n;type为一个具体的数据类型名,与类模板声明中的形式类型名相对应,系统根据这个实际的数据类型生成所需的类,并创建该类的对象。类模板
本文标题:嵌入式Linux下C++程序设计--04-2类与对象(下)this指针,const与static成员
链接地址:https://www.777doc.com/doc-3324566 .html