《C++ Primer》第7章 7.6节习题答案

C++ Primer:类的静态成员详解与应用
本文深入探讨C++中的类静态成员,包括其定义、优点及与普通成员的区别。通过实例展示了如何在自定义的Account类中使用静态成员,如静态成员变量与静态成员函数。同时,指出并解释了错误的静态成员声明和定义的问题,帮助读者理解静态成员的正确用法。

《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文件的两条语句也是错误的,因为在这里我们必须给出静态成员的初始值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值