C++ static类成员

来源:互联网 发布:皮尔斯生涯数据 编辑:程序博客网 时间:2024/05/22 00:21

一,static类成员

对于特定类类型的全体对象而言,访问一个全局对象有时是必要的。例如,在程序中需要统计已创建的特定类类型对象的数量。但是,定义一个全局对象会破坏封装性,一般的用户代码就可以修改这个值。类可以定义静态成员,而不是定义一个可普遍访问的全局对象。通常,非static数据成员存在于类类型的每个对象中。不像普通的数据成员,static数据成员独立于该类的任意对象而存在。每个static数据成员是与类相关联的,而不是与该类的对象相关联的。类也可以定义static成员函数,static成员函数没有this指针,它可以直接访问所属类的static成员,但是不能直接访问非static成员。


二,static成员

1,定义static成员:

在成员声明前加上关键字static,将成员声明为static。static成员遵循正常的公有/私有访问规则。例如:

class Account{private:    static double interestRate;    double amount;public:    static double rate(){        return interestRate;    }    static void setRate(double newRate){        interestRate = newRate;    }};


2,使用类的static成员:

可以通过作用域操作符从类直接调用static成员,或者对象、引用、指向该类型对象的指针间接引用。例如:

int main(){    Account ac;    Account *pac = ∾        //对象间接引用    ac.rate();    //指针间接引用   pac->rate();        //使用类类直接调用    Account::rate();    return 0;}


三,static成员函数

1,在类中声明static成员函数时要使用static关键字,在类外定义static成员函数,不用重复使用static关键字。

2,static成员函数没有this指针,因为static成员是类的组成部分,但不是任何对象的组成部分,因此,static成员函数没有this指针。因为static成员函数不是任何对象的组成部分,所以static成员函数不能声明为const。毕竟,将函数声明为const就是承诺该函数不会修改所属的对象。最后,static成员函数也不能声明为虚函数。


四,static数据成员

1,static数据成员必须在类类定义体的外部进行定义。不像普通的数据成员。static成员不是通过类构造函数进行初始化,而是在定义时进行初始化。例如:

class Account{private:    static double interestRate;    double amount;public:    static double rate(){        return interestRate;    }    static void setRate(double newRate){        interestRate = newRate;    }};//在类体外面定义并初始化static数据成员double Account::interestRate = 20.0;


2,特殊的const  static成员

类的static数据成员,像普通数据成员一样,不能在类的定义体中初始化。相反,static数据成员通常在定义时才初始化。这个规则的一个例外是,只要初始化式是一个常量表达式,整型const  static数据成员就可以在类的定义体中进行初始化。同样,它可以用在任何需要常量表达式的地方,例如指定数组成员daily_tbl的大小。

class Account{private:    //const static常量在类体中进行初始化   const static period = 20;    double daily_tbl[period];    double amount;public:    static double rate(){        return interestRate;    }    static void setRate(double newRate){        interestRate = newRate;    }};


3,static成员不是类对象的组成部分

普通成员都是给定类的每个对象的组成部分,static成员独立于任何类对象存在,不是类对象的组成部分。所以,它们的使用方式对于非static数据成员而言是不合法的。例如,static数据成员的类型可以是该成员所属的类的类型。非static成员被限定声明为其自身对象的指针或引用。

class Account{private:    static Account ac;    Account *pac;public:    //};
0 0
原创粉丝点击