静态成员变量和静态成员函数在C++类中的作用

为了便于理解,我们先来说说面向过程设计中的static,对理解面向对象设计中的static多少会有些裨益,也可以加深大家对这方面知识的理解。面向过程中设计中的static主要从以下几个方面来进行说明:

  • 静态全局变量,在其他文件中可以定义相同的名字而不会发生冲突;
  • 静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到一下次的调用,直到下次赋值;
  • 静态函数只能在声明它的文件当中可见,不能被其他文件使用,在其他文件中可以定义相同名字的函数,不会发生冲突。

面向对象设计中的static
一、静态数据成员
1、概念
静态数据成员在全局数据区分配内存,而非静态成员需要实例化才会分配内存。
对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问,所以静态数据成员的值对每个对象都是一样的,它的值可以更新。
而对于非静态数据成员,当类别实例化后,可以通过实例化的类名进行访问,非静态数据成员的生存期取决于该类的生存期,而且每个类对象都有自己的拷贝。而静态成员则不存在生存期的概念,因为静态数据成员始终驻留在内存中。
2、静态数据成员初始化
静态数据成员初始化与一般数据成员的初始化不同,

<数据类型><类名>::<静态数据成员> = <>;
eg:int MyClass::sum = 0;

静态数据成员主要用在各个对象都有相同的某项属性的时候。eg:存款类,每个对象的利息相同,所以把利息设为静态数据成员。
好处:1、不管定义多少个存款类的对象,利息数据成员都共享分配在全局数据区的内存,所以节省了存储空间;2、一旦利息需要改变是,只要改变一次,则所有存款类对象的利息全部改变过来了。

二、静态成员函数
1、概述
静态成员函数为类全部服务,而不是为类的具体某一个对象服务。
2、普通成员函数和静态成员函数的区别
普通成员函数一般都隐藏了一个this指针,this指针指向类的对象本身,因为普通成员函数总是具体的属于某个类的具体对象的。
一般,this指针是缺省的,但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。从这个意义上讲,静态成员函数无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
3、举例说明

#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass(int a,int b,int c);
    static void func();
private:
    int a, b, c;
    static int sum;
};
int MyClass::sum = 0;

MyClass::MyClass(int a,int b,int c)
{
    this->a = a;
    this->b = b;
    this->c = c;
    sum += a + b + c;
}

void MyClass::func()
{
    cout << "sum=" << sum << endl;
}

void main()
{
    MyClass M(1, 2, 3);
    M.func();

    MyClass N(4,5,6);
    N.func();

    MyClass::func();// 静态成员函数的访问

    return;
}

运行结果:
这里写图片描述

由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比,速度上会有少许的增长。需要总结一点的是,静态成员不能访问非静态成员,非静态成员可以直接访问类中的静态成员。

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值