静态成员变量与静态成员函数

转自:https://www.cnblogs.com/kiplove/p/6875371.html

原文最后有个小错误,没有加const,这里给加上。

 

一、静态成员变量

类的静态成员变量是直接与类联系,属于类的成员而不是对象,供所有对象共享,存放于全局区,因而不计入类的内存计算。

静态成员变量可以通过类直接访问。

(1)静态成员变量的初始化

静态成员不属于类的任何对象,所以并不是对象建立时被定义的,所以它不能由类的构造函数初始化,一般也不能在类内初始化。

关键字static只出现类的内部。

1、在类外定义且初始化

2、常量静态成员可以在类内初始化

一般来说无论怎样静态成员变量都需要在类外进行定义(定义可以初始化赋值,如果不显示初始化就是默认初始化)

(2))静态成员变量的访问

1、使用类作用域运算符直接访问

2、使用类的对象访问

3、成员函数可以直接访问

复制代码

#include <iostream>
using namespace std;
class A
{
public:
    A(){}
    int val();
    static int stval();
    static int ac;
    const static int bc=2;//常量静态成员可以在类内初始化
private:
    static int dc;
    int nn;
};
int A::ac=1;    //类外定义且初始化
int A::dc=1;
int A::stval()
{
//    nn=10; 静态成员函数不能调用非静态成员
    dc=20;
    return dc;
}
int A::val()
{
    dc=ac;
    return dc;
}
int main()
{
    A a;
    cout<<a.ac;    //使用类的对象访问
    cout<<a.val();
    cout<<A::bc;  //类作用域运算符直接访问
    cout<<A::stval();
    cout<<a.stval();
    return 0;
}

复制代码

(2)静态成员能使用的某些场景,普通成员不可以的

1、静态成员可以是不完全类型

2、静态成员可以作为默认实参

3、作为类对象的共享成员

复制代码

class B
{
public:
    B(){}
private:
    int val;
    static B num1;  //静态成员与指针都可以是非完整类型
    B* num2;
//    B num3;  //普通成员变量必须是完整类型
};

class C
{
public:
    C(char c = bkg){}
//    C(int v = yb){} 出错,普通成员变量不能作为默认实参
private:
    char df;
    int yb;
    static int yy;
    static const char bkg='a';
};
int C::yy=1;
int main()
{
    B b;
    C c;
    return 0;
}

复制代码

二、静态成员函数

1、静态成员函数类似于静态成员变量都属于类而不是对象。

2、静态成员函数仅可以调用类的静态成员变量,不可以调用普通成员变量。

3、不具有this指针,因而自然不能声明为const。

class A
{
public:
	A(){}
	int val();
	// static int stval ()const; //出错,不具有this指针
private:
	const static int bc = 2;//常量静态成员可以在类内初始化
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值