C++笔记(六)--- 静态成员变量/函数(static)

目录

C语言中静态变量

C++静态成员变量

C++静态成员函数


C语言中静态变量

1.函数内部用static修饰的变量,只能在此函数使用,但所修饰的变量不随函数释放而释放,下次调用时的值仍为上次结束时的值
2.static修饰的全局变量只能在其定义的文件使用
3.static修饰的函数只能在其所在的文件中被调用

知识点:static修饰的静态成员变量或成员函数是在编译链接过程中就分配好了内存空间,而普通成员函数是在运行过程中分配空间(根据  分配空间的时间点  这个知识点理解下文)

C++静态成员变量

1.C++类中的成员变量放置在全局静态变量区
2.C++类中的静态成员变量可以多个类成员之间数据共享
3.C++类中的成员变量必须在对应的cpp文件中进行定义(类成员函数只是声明,可以类比C中extern声明的int变量)
4.C++类中静态成员变量不能在构建函数中以列表方式初始化
//    a.h文件

class A
{
public:
   //    A():i(10){}//错误,不能以列表方式初始化静态成员变量
    A(){ i = 10; }    //正确
    void set(int ii) { i = ii; }
    void print(void) { cout << "A::i = " << i << endl; }
private:
    static int i;
}


//main.cpp文件

int A::i;    //类成员变量必须在对应cpp中进行定义,且不能用static修饰。否则与C标准中static修饰变量只能在本文件使用的规则冲突,从而报错

int main(void)
{
    A a,b;
    b.set(20);    //成员变量b对i进行赋值
    a.print();    //最后输出  A::i = 20, 静态成员变量可以多个类成员之间数据共享
    return 0;
}

C++静态成员函数

1.static成员函数内不能使用this指针
2.static修饰的成员函数只能处理static修饰的成员函数或变量
3.static修饰的成员函数可以在类没有实例化时调用
class A
{
public:
    A(){ }
    void print(void){ cout << "A::print()" << endl;}
    static void fun(void)
    {
        cout << "i: " << i << endl;    //正确
//下面错误写法的原因都是 类A未实例化,在内存中未分配空间,导致找不到对应变量或函数
//        cout << "i: " << this->i << endl;    //报错,“this”: 只能在非静态成员函数或非静态数据成员初始值设定项的内部引用
//        print();    //报错,“A::printf”: 非静态成员函数的非法调用
//        cout << "k: " << k << endl;    //报错,对非静态成员“A::k”的非法引用
//原因,当main函数使用 A::fun()调用此函数时,k并未定义,所以找不到k
    }
private:
    static int i;
    int k;
}

int main(void)
{
//    A::print();    //错误, 非static成员函数只能实例化后调用
    A::fun();    //正确,在编译链接时期就对static成员函数分配了空间,可以直接调用
    return 0;
}

static修饰类实例

1.静态类实例化时,是在编译链接时就已经分配好空间,但在使用时进行初始化
2.类实例化用static修饰时,它的析构函数在程序执行完成之后执行,而非对应的函数执行完毕
3.多个cpp文件定义static的类实例化时,类的构造函数执行是随机的
//a.h文件
class A
{
public:
    A() : i(0){ cout << "A() " << endl; }
    void print(void) { cout << "A::i = " << i << endl; }
private:
    int i;
};

//b.cpp文件
void b_fun()
{
    static A bFun;
}

//c.cpp文件
void c_fun()
{
    static A cFun;
}

//main.cpp文件
int main(void)
{
    cout << "Main Begin!" << endl;
    static A a;
    a.print();
    cout << "Main end!" << endl;
    return 0;
}

//b.cpp和c.cpp中的 bFun 和 cFun 的分配内存时间不能确定先后顺序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值