• c++--类的静态成员


    类的静态成员(static)

    有时候,类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。

    声明静态成员

    可以使public/private的,类型可以使常量、引用、指针、类类型等。

    class Account
    {
    public:
        void calculate(){amount+=amount*interestRate;}
        /*静态成员函数*/
        static double rate(){return interestRate;}
        static void rate(double);
    private:
        std::string owner;
        double amount;
        /*静态数据成员*/
        static double interestRate;
        static double initRate();
    };

    对象中不包含任何与静态数据成员有关的数据。因此,每个Account对象将包含两个数据成员:owner和amount。只存在一个interestRate成员,而且它被所有Account对象共享。
    类似的,静态成员函数也不与任何对象绑定在一起,他们不包含this指针。作为结果,静态成员函数不能声明成const的,而且我们不能再static函数体内使用this指针。

    使用类的静态成员

    double r;
    r=Account::rate();     //使用作用域运算符访问静态成员
    /********************************************/
    Account ac1;
    Account *ac2=&ac1;
    r=ac1.rate();           //通过Accountd 的对象或引用访问
    r=ac2->rate();        //通过指向Account 对象的指针访问

    虽然静态成员不属于类的某个对象,但仍然可以使用类的对象、引用或者指针来访问静态成员。
    成员函数不用通过作用域运算符就能直接使用静态成员(把静态成员看做类内成员就行)。

    定义类静态成员(static关键字只出现在类内部声明)

    静态成员函数:定义可内可外,外部不写static,外部必须有作用域运算符(和定义在外部的普通成员函数一样)

    静态数据成员:定义在外,外部不写static,外部必须有作用域运算符

    /*静态成员函数定义*/
    void Acount::rate(double newRate)
    {
        interestRate=newRate;
    }
    /*静态数据成员定义并初始化*/
    double Account::interestRate=initRate();   //注意作用域运算符不能忘

    类似全局变量,静态数据成员定义在任何函数之外。一旦定义,就一直存在于程序的整个生命周期中。

    静态成员的类内初始化??

    通常,类的静态成员不应该在类的内部初始化。然而,可以为静态成员提供const整数类型的类内初始值,不过要求静态成员必须是字面值常量类型的constexpr.

    class Account
    {
    ...
    private:
        static constexpr int period=30;
        double daily_tbl[period];
    };
    
    //一个不带初始值的静态成员的定义
    constexpr int Account::period;      //初始值在类的定义内提供

    即使一个常量静态成员在类内部被初始哈了,通常情况下也应该在类的外部定义一下该成员。

    静态成员能用于某些场景,而普通成员不能

    1.静态数据成员可以使不完全类型。特别的,静态数据成员的类型可以使它所属的类类型。

    2.可以使用静态数据成员作为默认实参。

    class Screen
    {
    public:
        //bk表示一个在类中稍后定义的静态成员
        Screen& clear(char=bk);
    private:
        static Screen mem;     //不完全类型Screen
        static const char bk;    //bk可作为默认实参
    };
  • 相关阅读:
    vs编译错误error C2059 由extern "C"导致的错误处理
    原生JS:响应式轮播图
    JSP用户关注取关实现
    JSP和AJAX实现登录注册
    MySQL常用命令
    offsetWidth/getBoundingRect()/scrollWidth/client用法总结
    画廊相册—原生JavaScript实现
    《JavaScript DOM 编程艺术》读书笔记
    天猫网页前端实现
    Docker安装和配置(链接集合)
  • 原文地址:https://www.cnblogs.com/cygalaxy/p/7002716.html
Copyright © 2020-2023  润新知