static关键字

一. C语言中的static

1.静态局部变量

静态局部变量具有以下特点:

(1)静态局部变量的生存期为整个程序生存期,但作用域与自动变量相同。只能在定义该静态局部变量的函数中访问,退出函数之后,则无法继续访问。
(2)对于基本类型的静态局部变量若在声明时未赋初值,则编译器会默认初始化为0,而自动变量则不会。
int GetNumber()
{
    static int na = 10;    // 1.若不初始化,编译器会默认初始化为0 2.只会在第一次调用该函数执行
    int nb = 10;           // 若不初始化,编译器会报错

    return na--;
}

int main()
{
    for (unsigned int na = 0; na < 10; na++)
    {
        std::cout << na << "\t" << GetNumber() << std::endl;
    }

    return 0;
}
2.静态全局变量与静态全局函数

static关键字很大的一个作用就是隐藏,即所定义的变量/函数仅在本文件中生效。

二.C++语言中的static关键字(类中的static关键字)

1.静态成员变量

声明规则:成员变量前添加static关键字即可。
静态成员变量特点:

(1)静态成员变量在所有的类对象实例中仅有一份拷贝,由所有类对象实例共享(节省内存)。
(2)静态成员变量存储在全局数据区,当其定义时,才会分配内存空间。
(3)因静态成员变量不属于任何类对象实例,因此我们可以在无类对象实例的情况下访问,访问方式为 <类名>::<静态成员对象名>
(4)静态成员变量依然遵守类访问属性规则。

静态成员变量优点:

(1)我们通常把所有类对象相同的属性定义为静态成员变量,这样有两种好处:一是多个类对象实例中仅存在一份拷贝,节省内存空间;二是当我们需要修改这一共有属性时,所有的实例都会更改,不容易出错。
(2)静态成员变量可以实现信息隐藏,即定义为private属性。
2.静态成员函数

声明规则:成员函数前添加static关键字即可。
静态成员函数特点:

(1)静态成员函数多所有的类对象实例中仅有一份拷贝,因此其不存在**隐藏的this指针**。显而易见,其无法访问no-static函数/成员变量。
(2)普通成员函数可以随意访问静态成员变量/函数
class CAccount
{
public:

    double get_deposit() const { return m_deposit; }
    double get_rate() const { return m_rate; }

    static double get_rate_static() { return m_rate; }
private:
    double m_deposit;     // 账户存款<非静态成员变量>
    static double m_rate; // 利率<静态成员变量>
};

double CAccount::m_rate = 0.8;  // 静态成员变量定义

int main()
{
    // std::cout << CAccount::m_rate << std::endl; // 若m_rate为public,则无需对象也可访问

    CAccount tom_account;

    std::cout << tom_account.get_rate() << std::endl;
    std::cout << tom_account.get_rate_static() << std::endl;
    std::cout << CAccount::get_rate_static() << std::endl;
    return 0;
}

你可能感兴趣的:(c++)