C++类与对象之静态成员和静态成员函数

C++面向对象编程中,静态成员也是较为重要的。

C++的变量存储区除了堆区和栈区之外,还存在静态存储区,用于存放static静态变量,全局变量以及常量,生命周期是从程序开始运行到结束。

下面分两个部分,静态成员和静态成员函数来讲解:

静态成员
  • 所有对象共享同一份数据。
  • 在编译阶段分配内存。
  • 类内声明,类外初始化。

那么何为类内声明,类外初始化呢?

//test.cpp 
#include <stdio.h> 
class A { 
    public: 
        static int a; //声明但未定义
 }; 
int main() { 
    printf("%d", A::a);
    return 0;
}

首先这里的初始化不是指定义变量或者赋值,而是分配内存空间,上述示例运行结果将会报错,原因就是静态变量没有类外初始化。我们再看下面一个例子

//test.cpp 
#include <stdio.h> 
class A { 
    public: 
        static int a; //声明但未定义
 }; 
int A::a; //定义了静态成员变量,同时初始化。也可以写"int A:a;",即不给初值,同样可以通过编译
int main() { 
    printf("%d", A::a);
    return 0;
}

这里即使不对A::a赋值,也能输出结果,因此这里的初始化,指分配内存,而不是赋值。

静态成员函数
  • 前面加上static。
  • 所有对象共享同一个函数。
  • 静态成员函数只能访问静态成员变量。
  • 静态成员函数类内类外均可实现

调用方法:

1、通过对象访问:类对象.函数(class.fun)

2、通过类名访问:类名::函数(class::fun)

这里同样要说明的是,为什么静态函数只能调用静态变量?

这需要结合上面的静态成员来解释

  • 首先,静态成员是所有对象共享,它不属于某个类的对象,在没有进行实例化时,静态成员变量就已经存在。
  • 其次,非静态成员必须在类的对象创建时才会分配内存。
  • 所以,静态成员函数是“看不见”非静态成员变量的。

C++会区分两种类型的成员函数:静态成员函数和非静态成员函数。这两者之间的一个重大区别是,静态成员函数是没有this指针的,且不接受隐含的this自变量,无法访问自己类的非静态成员。

使用静态成员的优点: 静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。


如果我所写内容存在问题,欢迎讨论,如果有所帮助,希望点赞,收藏加关注,我们一起努力!!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值