加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 教程 > 正文

C++之static静态修饰符介绍

发布时间:2021-12-14 21:04:55 所属栏目:教程 来源:互联网
导读:静态类成员:是那些与类本身有关的成员数据和成员函数,而不是与该类对象相关的成员数据和成员函数。 所以静态成员数据也称为类数据,静态成员函数也称为类方法。静态成员数据在类里只是一个说明,还需要一个定义(或叫初始化)。静态成员数据要在类定义之外
•静态类成员:是那些与类本身有关的成员数据和成员函数,而不是与该类对象相关的成员数据和成员函数。
 
所以静态成员数据也称为类数据,静态成员函数也称为类方法。静态成员数据在类里只是一个说明,还需要一个定义(或叫初始化)。静态成员数据要在类定义之外被初始化(要用类名限定修饰),而且程序里只能提供一次,所以初始化不能放在头文件里。
 
例1:
 
class Test{
public:
    static int k;
    Test(int a):k(a){   
 
    }
};
//error: 'int Test::k' is a static data member; it can only be initialized at its definition
例2:
 
C++规定const静态类成员可以直接初始化,其他非const的静态类成员需要在类声明以外初始化,我们一般选择在类的实现文件中初始化。
 
int Test::k;
 
默认初始化为0;
 
也可自己指定:
 
int Test::k(20);
 
class Test{
public:
    static const int a = 10;   
    static int k;
};
 
int Test::k;
 
int main(){
    cout << Test::k << endl;
    cout << Test::a;
    return 0;
}
•在inline函数里不要使用静态成员数据,因为编译器不能保证此时静态成员数据已初始化。
 
class Test{
public:
    static const int a = 10;
    static int k;
    void f(){
        k++;
    }
};
int Test::k(20);
int main(){
    Test t;
    t.f();
    cout << Test::k;
    return 0;
}
•静态成员数据与全局变量的比较:静态成员数据不论类由多少实例,它都只有一个拷贝,这和全局变量类似。但静态成员数据有个作用域名字,而且不一定是public的。
 
•静态成员函数不能声明为const和volatile。
 
•静态成员函数和友元函数比较:静态成员函数和友元函数都没有隐含的this指针,且都能访问类的private和protected部分。但静态成员函数有个作用域名字,而且不一定是public的。
 
•const静态成员数据:在有些C++编译器里,有序型的(如int,unsignedlong,char等)const静态成员数据可以
 
在类里对其初始化。
 
•静态成员数据初始化次序:静态初始化成员数据次序和类作用域的静态对象、文件作用域和名字空间作用域的对象的生存周期有关。当在不同编译单元(即.cpp文件)的静态初始化有次序依赖,这就有可能有危险。解决的办法将静态成员数据转换为静态成员函数。
 
•volatile:当一个对象的值可能会在编译器的控制或监视之外被改变,那该对象应该声明为volatile。 此时编译器执行的一些例行优化对它不能应用。volatile也可以修饰类成员函数。对于volatile类对象它只能调用volatile成员函数、构造函数和析构函数。
 
 

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读