所以有时将静态数据成员称为类变量,使用静态数据成员可以节省内存空间。静态数据成员可由任意访问权限许可的函数访问。因为静态数据成员不从属于任何一个具体对象,所以必须对它初始化,而且对它的初始化不能在构造函数中进行。解:本程序的执行结果如下:s=12s=17s=35从上述执行结果可以看到,类MyClass1中静态数据成员s不是属于某个对象a、b或c,而是属于所有的对象。......
2023-11-07
静态成员函数与静态数据成员类似,也是属于类的。只要类存在,静态成员函数就可以使用,静态成员函数的定义是在一般函数定义前加上static关键字,定义静态成员函数的格式如下:
调用静态成员函数的格式如下:
类名∷静态成员函数名(实参表)
允许用对象或指向对象的指针调用静态成员函数,格式如下:
对象名.静态成员函数名(实参表)
对象指针->静态成员函数名(实参表)
注意:静态成员函数只能访问静态数据成员、静态成员函数和类以外的函数和数据,不能访问类中的非静态数据成员(因为非静态数据成员只有对象存在时才有意义)。但静态数据成员和静态成员函数可由任意访问权限许可的函数访问。与一般成员函数类似,静态成员函数也有访问限制,私有静态成员函数不能由外界访问。
【例3.2】分析以下程序的执行结果。
解:本程序的执行结果如下:
s=5
程序中定义对象a(2)时,通过构造函数使静态数据成员n=2,在定义对象b(5)时,通过构造函数使静态数据成员n=5(覆盖前面n=2),再执行MyClass2∷add()语句使全局变量s=5。
注意:尽管代码中静态数据成员n的初始化语句int MyClass2∷add()n=0没有意义(因为各对象中的n值由变量i赋给),但不能省略,否则会出现编译错误。
【例3.3】分析以下程序的执行结果。
解:上述程序中,先说明了一个类MyClass3,其中有一个静态数据成员n,并给它赋初值。在main()中,先定义一个指向匿名对象的指针p(创建该匿名对象时也要自动调用MyClass3类的构造函数),另外定义了一个含有4个对象元素的数组。这样共执行构造函数5次,n累计为5。程序执行结果如下:(www.chuimin.cn)
n=5
【例3.4】编写一个程序,已有若干个学生数据,这些数据包括学号、姓名、语文成绩、计算机成绩和英语成绩,求各门课程的平均分。要求设计不同的成员函数求各门课程的平均分,并使用成员函数指针调用它们。
解:设计一个学生类student,包括no(学号)、name(姓名)、grade1(语文成绩)、grade 2(计算机成绩)、grade 3(英语成绩)数据成员和3个静态数据成员sum1(累计语文总分)、sum2(累计计算机总分)、sum3(累计英语总分);另外有一个构造函数和3个求三门课程平均分的成员函数和一个display()成员函数。程序如下:
本程序的执行结果如下:
输出结果
学号 姓名 语文 数学 英语
1 Li 60 80 90
2 Ma 70 85 99
3 Zheng 80 89 90
4 Chen 50 60 70
语文平均分:65
数学平均分:78.5
英语平均分:87.25
有关C++程序设计基础教程的文章
所以有时将静态数据成员称为类变量,使用静态数据成员可以节省内存空间。静态数据成员可由任意访问权限许可的函数访问。因为静态数据成员不从属于任何一个具体对象,所以必须对它初始化,而且对它的初始化不能在构造函数中进行。解:本程序的执行结果如下:s=12s=17s=35从上述执行结果可以看到,类MyClass1中静态数据成员s不是属于某个对象a、b或c,而是属于所有的对象。......
2023-11-07
在类声明中,public、private和protected是关键字,称为成员访问限定符,它们分别表示公有、私有和保护的成员访问权限。其他函数不能访问该类的保护数据成员,也不能调用该类的保护成员函数。◇一旦给出了成员访问限定符,它后面的成员都具有这个成员访问权限,直到出现另一个成员访问限定符或类声明结束为止。类的成员函数可以访问类的所有成员,没有任何限制,而类的对象对类的成员的访问是受成员访问控制符制约的。......
2023-11-07
声明函数模板的一般格式如下:template<模板参数表>函数返回值类型函数模板名(形参表)函数模板定义由关键字template开头,表示声明一个模板。模板参数表写在尖括号<>中,参数一般由关键字class或typename后加一个标识符构成。Class和typename的意义相同,表示后面的标识符是一个参数类型,代表一个潜在的标准类型或用户定义的类型。例如,定义max函数模板求两个数中的较大者。如下面的声明是错误的:可以看出,用函数模板比函数重载更方便,程序更简洁。......
2023-11-07
声明虚函数的一般格式如下:virtual函数类型函数名(参数表)其中,用关键词virtual声明的函数称为虚函数。如果一个成员函数被声明为虚函数,这就意味着该成员函数在派生类中可能有不同的实现。动态绑定只能通过指针或引用标识对象来调用虚函数。......
2023-11-07
为此,C++提供了一个更好的方法,就是利用类的构造函数来初始化类的数据成员。构造函数具有如下几个特点:构造函数名与类名相同,且没有返回值,不能指定函数类型。构造函数通常被声明为公有属性,但它不能像其他成员函数那样被显式地调用,它是在创建对象时被系统自动调用的。例如,可以将例2.1的MyClass类扩展为MyClass2,使其包含两个构造函数:上述类中包含两个构造函数:一个没有参数,另一个有两个参数。......
2023-11-07
如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数。只能通过构造函数的参数初始化表对常数据成员进行初始化。这样,在执行构造函数时自动将“常数据成员1”赋值为“参数1”的值,“常数据成员2”赋值为“参数2”的值,…......
2023-11-07
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2023-11-07
析构函数被系统自动调用分两种情况。分析以下程序的执行结果。解:本程序执行结果如下:调用带参构造函数矩形s1的面积=153调用无参构造函数矩形s2的面积=0调用了析构函数!......
2023-11-07
相关推荐