C++——静态成员详解

本文详细介绍了C++中类的静态成员,包括静态成员数据和静态成员函数的声明、定义及使用方法。静态成员不与类的对象绑定,而是与类本身相关联。静态成员函数不具备this指针,无法访问非静态成员,只能访问静态成员。静态数据成员通常在外部初始化,而静态成员函数可在类内外定义。此外,静态成员可以作为默认参数,且类型可以是不完全类型,甚至可以是类自身类型。
摘要由CSDN通过智能技术生成

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

本质:静态成员与类本身直接相关,而不与类对象保持关联,除此之外,它和其他类成员基本一样

静态成员包括:静态成员数据,静态成员函数

如何声明?

在成员声明之前加上static关键字。

class A {
public:   // or private 
    static int a;        // 静态成员数据声明,也是定义
    static int func();   // 静态成员函数声明
    static int func() const; // error!
}

note : 静态成员函数也不与任何对象绑定在一起,即不拥有this指针,这也就导致了静态成员函数体内不能使用this指针,也不能访问非静态成员(隐式this指针),且其不能被声明为const(因为const表示该函数不会修改对象的成员数据,而static函数压根不能访问对象(非类)的数据成员,也就谈不上修改了,故而c++规定不能用将静态成员函数声明为const。)

再次强调:静态成员函数只能访问类的静态成员变量。

如何定义?

注意,这时成员数据和成员函数的行为是不同的。

  • 成员数据

    • 通常在外部初始化
    int A::a = 10;
    
    • 如果非要在内部初始化,那么成员数据必须是 constexpr 或者 const 修饰的整数类型,初始值必须是字面值常量整数类型
    class A{
         // ok,但只能用于类内替换,否则必须在外部重新定义(具体见C++ primer 5nd p271),但不需要再次指定初始值
        static constexpr int a = 10; 
        static const float a = 10.0;   // error 不是整数类型
        static int a = 10;   // error!
    } 
    
  • 成员函数:内类内外都可定义,不写static关键字。

int A::func(){    // 内外定义,加上类作用域,不写static关键字
   ....
}

如何使用?

  • 通过作用域运算符访问
cout << A::a << endl;
  • 和普通成员函数一样
A obj;  
A* ptr;
cout << obj.a << endl;    // 通过对象(或引用)访问
cout << ptr->a << endl;  // 通过指针访问

特殊场合

  • 静态数据类型可以是不完全类型,特别的,静态数据成员的类型可以就是它所属的类类型,普通成员则不行。
class A{
    static A a;  // ok
    A b;  // error!
}
  • 静态成员可以做默认实参,普通成员则不行。
class A{
   static int a;
   int func(int num =  a;)
}

参考资料: c++ primer 5nd p268–p272。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rob月初

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值