C++ class中的静态(static)成员
(1)
//
#include "account.h"
double Account::_interestRate = 0.0589;
#include <string>
class Account
{
// ...
private:
};
const string Account::name( "Savings Account" );
作为特例,整型的const
//
class Account {
// ...
private:
static const int nameSize = 16;
static const char name[nameSize];
};
//
const int Account::nameSize; //
const char Account::name[nameSize] = "Savings Account";
用常量值作初始化整型的const
因为name
class Account {
// ...
private:
static const int nameSize = 16; // ok:
static const char name[nameSize] =
"Savings Account"; //
};
name
这个例子还说明了一点我们注意到成员nameSize
const char Account::name[nameSize] = "Savings Account";
nameSize
③静态数据成员的访问
1.
inline double Account::dailyReturn()
{
}
2.
class Account {
// ...
private:
friend int compareRevenue( Account& , Account* );
//
};
//
int compareRevenue( Account &ac1, Account *ac2 )
{
double ret1, ret2;
ret1 = ac1._interestRate * ac1._amount;
ret2 = ac2->_interestRate * ac2->_amount;
// ...
}
ac1._interestRate
//
if ( Account:_interestRate < 0.05 )
当我们不通过类的成员访问操作符访问静态数据成员时必须指定类名以及紧跟其后的域操作符
因为静态成员不是全局对象所以我们不能在全局域中找到它下面的friend
int compareRevenue( Account &ac1, Account *ac2 )
{
double ret1, ret2;
ret1 = Account::_interestRate * ac1._amount;
//私有的静态成员变量_interestRate
ret2 = Account::_interestRate * ac2->_amount;
// ...
}
注意:静态数据成员的“惟一性”本质(独立于类的任何对象而存在的惟一实例),使它能够以独特的方式被使用,这些方式对于非static
①静态数据成员的类型可以是其所属类,而非static
class Bar {
public:
// ...
private:
static Bar mem1; // ok
Bar *mem2; // ok
Bar mem3; //
};
2
extern int var;
class Foo {
private:
int var;
static int stcvar;
public:
//
//
int mem1( int = var );
// ok:
//
int mem2( int = stcvar );
// ok: int var
int mem3( int = ::var );
};
(2)
静态成员函数没有this
我们可以用成员访问操作符点.
(3)在派生类中的静态数据成员与静态成员函数
class的static data member只有一份实例,被class和class的派生类的所有实例共享。class和class的派生类共用同一块内存中的静态数据成员。
一个简单的例子:
#include <iostream>
using namespace std;
class A{
public:
private:
};
int A::a = 5;
class B : public A{
public:
};
int main(){
cout<< "a=" << A::GetA() <<'/n';
cout<< "a=" << B::GetA() <<'/n';
B::SetA(4);
cout<< "a=" << B::GetA() <<'/n';
cout<< "a=" << A::GetA() <<'/n';
return 0;
}
类的静态函数与函数中的静态数据成员在编译期绑定!