static:类的静态成员

本文详细介绍了C++中static关键字的使用,包括局部变量、全局变量、函数的static特性,以及在类中static成员函数和变量的声明、定义与初始化。探讨了static与非static的区别,并提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<string>
using namespace std;

class Account {
public:
    void calculate() { amount += amount * interestRate; }  // 成员函数不通过Account::就可以直接访问static成员
    static double rate() { return interestRate; } // 这里不允许使用类的非静态成员,因为静态成员函数没有this指针
    static void rate(double);
private:
    string owner;
    double amount;
    static double interestRate;
    static double initRate();
};

// 当在类外部定义静态成员函数时,不能重复static关键字
void Account::rate(double newRate) {
    interestRate = newRate;
}


int main(int argc, char** argv)
{
    double r;
    r = Account::rate();    // 使用作用域运算符访问静态成员

    // 虽然静态成员不属于类对象,但却可以通过类对象使用
    Account a1;
    Account* a2 = &a1;
    r = a1.rate();
    r = a2->rate();
    
    return 0;
}

一、不在类中的static的使用

1.作用

1.局部变量被申明为static,表示这个函数结束的时候这个的值不变。

2.外部变量被申明为static表明它是一个本地全局变量。改变量只能在该文件内被访问,不能被其它文件访问。

2.Static与非static的区别

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

二、类中的static的使用

1.static成员函数

(1)关键字static只在类的定义体内部出现(与const不同,与friend相同)

(2)没有this指针

(3)不能被声明为const或virtual

2.static成员变量
例1:/静态数据成员相关的操作有三个分别是声明、定义与初始化
声明:说明这个类中有这样一个成员,但是不分配空间(1)
定义:分成员开辟内存空间,静态成员的空间在静态成员区,和类的其它成员不在一起(2)
初始化化:为它定义一个初值(4)
对于static数据成员:
声明在函数体内,定义和初始化要在函数体外,定义和初始化常常放在一句话里(3)
(2)和(3)不能同时出现
/

class A
{
public:
	static int x;//(1)
};
int A::x;//(2)
int A::x = 2;//(3)
int main()
{
	A::x = 2;//(4)
	return 0;
}

3.static成员常量
例2:/对于const static数据成员,情况比较特殊
声明在函数体内,定义在函数体外,但是初始化可以在函数体内或外都可以
注意(1),const在声明和定义时都要出现,而static只在声明的时候出现
如果在函数体外初始化,和前一个例子相同,下面程序是在函数体内定义的情况
注意(2)千万不在把定义少了
/

class A
{
public:
	const static int x = 2;//声明和初始化在一起
};
const int A::x;//定义
int main()
{
//	A::x = 2;//(4)
	return 0;
}

4.不管是2还是3,声明、定义不可少

少了声明,会出现链接错误

少了定义,会没有分配空间

少了初始化,默认初始化为0

5.非static数据成员不能用作默认实参
例3:

class A
{
public:
	static int x;
	int y;
	void Test1(int para = x){}//正确
	void Test2(int para = y){}//错误
};
int A::x = 2;//定义

6.静态数据成员在没有对象之前就存在

7.静态成员函数不能被声明为虚函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值