zoukankan      html  css  js  c++  java
  • C++中static类成员

    static局部变量

    static局部变量确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化

    这种对象一旦被创建,在程序结束前不会被撤销。在该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值。

    #include<iostream>
    #include<string>
    #include<assert.h>
    using namespace std;
    size_t count_calls()
    {
        static size_t ctr=0;
        return ++ctr;
    }
    
    int main()
    {
        for(size_t i=0; i!=10; ++i)
            cout<<count_calls()<<endl;
        getchar();
        return 0;
    }

    本文地址:http://www.cnblogs.com/archimedes/p/cpp-static.html,转载请注明源地址。

    static类成员

    全局对象会破坏封装,对象需要支持特定类抽象的实现,类可以定义类静态成员,不像普通的数据成员,static数据成员独立于该类的任意对象而存在。

    1、使用类的static成员的优点:

    (1)static成员的名字在类的作用域中,因此可以避免与其他类的成员或全局对象的名字冲突;

    (2)可以实施封装。static成员可以是私有成员,而全局对象不是;

    (3)通过阅读程序容易看出static成员是与特定类关联的。

    2、定义static成员

    考虑一个银行账户类,每个账户的利率总是相同的,代码如下:

    class Account{
    public:
        void applyint() {amount+=amount*interestRate;}
        static double rate() {return interestRate;}
        static void rate(double);
    private:
        string owner;
        double amount;
        static double interestRate;
        static double initRate();
    };

    3、使用类的static成员

    可以通过作用于操作符从类直接调用static成员,或者通过对象、引用或指向该类类型对象的指针间接调用

    Account ac1;
    Account *ac2=&ac1;
    double rate;
    rate=ac1.rate();
    rate=ac2->rate();
    rate=Account::rate();

    像其他的成员函数一样,类成员函数可以不用作用域操作符来引用类的static成员:

    class Account{
    public:
        void applyint(){ amount+=amount*interestRate;}
    };

    static成员函数

    类的成员函数定义在类的外面不需要重复static关键字

    static函数没有this指针

    static成员函数不能被声明为const,也不能声明为虚函数

    static数据成员

    static数据成员可以声明为任意类型,必须在类定义体的外部定义(正好一次),static数据成员不能通过类的构造函数初始化

    1、特殊的整型const static成员

    一般而言,类的static成员,不能在类的定义体中初始化,通常在定义时就初始化,但是一个例外是:只要初始化式是一个常量表达式,整型const static数据成员就可以在类的定义体中进行初始化:

    class Account{
    public:
        static double rate() {return interestRate;}
        static void rate(double);
    private:
        static const int period=30;
        double daily_tbl[period];
        static double interestRate;
    };

    2、static成员不是类对象的组成部分

     static数据成员可以用作默认实参:

    class Screen {
    public:
        Screen clear(char=bkground);
    private:
        static const char bkground='#';
    };

    非static成员不能用作默认的参数,因为它们的值不能独立于所属的对象而使用

  • 相关阅读:
    WorkerMan中php后端及时推送消息给客户端
    解析Laravel框架下的Contracts契约
    如何在 Laravel 中使用 Slack 进行异常通知
    用户异常与模拟异常的派发
    [IDA] 将变量索引进行计算
    [反汇编]栈帧中函数的参数传入位置
    用户模拟异常的记录
    [反汇编]函数开始部分利用mov ebx,esp找到返回地址(_KTRAP_FRAME结构)
    [反汇编] 获取上一个栈帧的ebp
    CPU异常分析(以trap00为例)
  • 原文地址:https://www.cnblogs.com/wuyudong/p/cpp-static.html
Copyright © 2011-2022 走看看