c++之static

1.静态数据成员

声明:
static int s_iCount;
初始化:
int Tank::s_iCount = 0;
必须写到类的外边进行初始化。
静态数据成员并不依赖于对象实例化而是伴随类的产生而产生,普通数据成员依赖于对象。静态数据成员不在构造函数中实例化,一般是单独实例化。
对于非静态成员,每个类对象都有自己的拷贝,而对于静态数据成员,无论定义多少个类对象,它都只被拷贝一次,且可以被该类的所有对象访问。
静态数据成员只分配一次内存,对于每个对象,它的值都是一样的,且它的值可以更新。静态数据成员在全局数据区分配内存。
• 静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
• 类的静态数据成员有两种访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

2.静态成员函数

静态数据成员也是在类的内部实现,普通的成员函数一般都隐含了一个this指针,静态成员函数不与任何对象相联系,因此不具有this指针,因此,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数。
代码示例:

Tank.h
#ifndef TANK_H
#define TANK_H

class Tank{
public:
    Tank(char code);
    ~Tank();
    void fire();
    static int getCount();
private:
    static int s_iCount;
    char m_cCode;
};
#endif
Tank.cpp
#include"Tank.h"
#include<iostream>
using namespace std;

int Tank::s_iCount = 10;

Tank::Tank(char code){
    m_cCode = code;
    s_iCount++;
    cout << "Tank" << endl;
}
Tank::~Tank(){
    s_iCount--;
    cout << "~Tank" << endl;
}
void Tank::fire(){
    cout << "fire" << endl; 
}
int Tank::getCount(){

    return  s_iCount;
}
demo.cpp
#include"Tank.h"
#include<iostream>
using namespace std;

int main(void){

    //cout << Tank::getCount() << endl;
    Tank *p = new Tank('a');
    cout << p->getCount() << endl;
    Tank *q = new Tank('b');

    cout << Tank::getCount() << endl;
    delete p;
    delete q;
    p = NULL;
    q = NULL;
    cout << Tank::getCount() << endl;
    system("pause");
    return 0;
}

注意事项:
1.静态数据成员必须单独初始化。
2.静态成员函数不能调用非静态成员函数和非静态数据成员。
3.非静态的成员函数则可以调用静态的数据成员和静态的成员函数。
4.静态数据成员只有一份,且不依赖于对象而存在,对象的大小不包含静态数据成员。
5.出现在函数体外的函数定义不能使用关键字static。
6.静态成员函数与类的全局函数相比速度更快。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值