《C++ Primer》第7章 类
7.6节 类的静态成员
练习7.56:什么是类的静态成员?它有何优点?静态成员与普通成员有何区别?
【出题思路】
本题考查静态成员的含义及用法。
【解答】
静态成员是指声明语句之前带有关键字static的类成员,静态成员不是任意单独对象的组成部分,而是由该类的全体对象所共享。静态成员的优点包括:作用域位于类的范围之内,避免与其他类的成员或者全局作用域的名字冲突;可以是私有成员,而全局对象不可以;通过阅读程序可以非常容易地看出静态成员与特定类关联,使得程序的含义清晰明了。静态成员与普通成员的区别主要体现在普通成员与类的对象关联,是某个具体对象的组成部分;而静态成员不从属于任何具体的对象,它由该类的所有对象共享。另外,还有一个细微的区别,静态成员可以作为默认实参,而普通数据成员不能作为默认实参。
练习7.57:编写你自己的Account类。
【出题思路】
本题练习在自定义的类中使用静态成员。
【解答】
如果类的某些(某个)成员从逻辑上来说更应该与类本身关联,而不是与类的具体对象关联,则我们应该把这种成员声明成静态的。在Account类中,很明显利率是相对稳定和统一的,应该是静态成员;而开户人以及它的储蓄额则与对象息息相关,不能是静态的。
#include <iostream>
using namespace std;
class Account
{
public:
void calculate()
{
amount += (amount * interestRate);
}
static double rate()
{
return interestRate;
}
static void rate(double newRate)
{
interestRate = newRate;
}
private:
std::string owner;
double amount;
static double interestRate; // 类内声明
static double initRate();
};
//为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
double Account::interestRate = 0.0;// 类外初始化,不必再加static关键字
double Account::initRate()
{
return 0.0;
}
int main()
{
cout << "start=================" << endl;
double r;
r = Account::rate(); //使用作用域运行符访问静态成员
cout << "r=========1=========" << r << endl;
Account ac1;
Account *ac2 = &ac1;
//调用静态成员函灵敏rate的等价形式
r = ac1.rate(); //通过Account的对象或引用
cout << "r=========2=========" << r << endl;
r = ac2->rate(); //能过指向Account对象的指针
cout << "r=========3=========" << r << endl;
return 0;
}
运行结果:

练习7.58:下面的静态数据成员的声明和定义有错误吗?请解释原因。
//example.h
class Example {
public:
static double rate = 6.5;
static const int vecSize = 20;
static vector<double> vec(vecSize);
};
//example.c
#include "example.h"
double Example::rate;
vector<double> Example::vec;
【出题思路】
本题旨在考查静态成员的用法。
【解答】
本题的程序存在以下几处错误:在类的内部,rate和vec的初始化是错误的,因为除了静态常量成员之外,其他静态成员不能在类的内部初始化。另外,example.C文件的两条语句也是错误的,因为在这里我们必须给出静态成员的初始值。
C++ Primer:类的静态成员详解与应用
本文深入探讨C++中的类静态成员,包括其定义、优点及与普通成员的区别。通过实例展示了如何在自定义的Account类中使用静态成员,如静态成员变量与静态成员函数。同时,指出并解释了错误的静态成员声明和定义的问题,帮助读者理解静态成员的正确用法。
952

被折叠的 条评论
为什么被折叠?



