温故而知新,闲来无事,再次捧了本c++primer 看了看,写点c++静态成员变量和成员函数吧,以前一直在用,但是有没有完全搞懂什么时候该用static 成员变量,什么时候该用static function,什么时候不要用静态成员函数。 静态成员变量:primer中是这样说的,对于所有的对象共有一个成员变量的就用static ,提供一个所有对象共有的一个成员变量比“每一个类对象维护一个成员变量” 要更有效。
在这种情况下类的静态数据成员提供了一个更好的方案静态数据成员被当作该类类型的全局对象对于非静态数据成员,每个类对象都有自己的拷贝而静态数据成员对
每个类类型只有一个拷贝静态数据成员,只有一份由该类类型的所有对象共享访问。同全局对象相比使用静态数据成员有两个优势 class Account { Account( double amount, const string &owner ); string owner() { return _owner; } static double getRate(){return _interestRate;}
为什么把_interestRate 声明为static 而_amount 和_owner 不呢,这是因为每个Account对应不同的主人有不同数目的钱而所有Account 的利率却是相同的,因为在整个程序中只有一个_interestRate 数据成员它被所有Account对象共享,所以把_interestRate声明为静态成员,减少每个Account对象所需的存储空间。
静态成员函数:静态成员函数一般只能访问静态成员变量,如果要访问非静态成员变量的话,只能访问某一个对象的非静态成员变量和静态成员函数。可以传一个对象的指针,引用等参数给这个静态成员函数。 class a {
静态成员函数中是不能调用非静态成员的,包括非静态成员函数和非静态成员变量。那么在非静态成员函数中是否可以调用静态成员函数呢?答案是肯定的,因为静 态成员函数属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员函数的。其实,我们也可以以一个内存模型这个角度来考 虑,也就是说,无论采取什么样的操作,程序代码都是在内存中运行的,只有在内存中占有了一席之地,我们才能访问它。如果一个成员函数或成员变量还没有在内 存中产生,结果是无法访问它的。所有静态成员函数只能访问静态成员变量。 使用static关键字声明的函数成员使静态的,静态成员函数同样也属于整个类,由同一个类的所有对象共同维护,为这些对象所共享. 静态成员变量一般要在.cpp文件里进行定义:double Account::_interestRate = 0.0589;静态成员函数的声明除了在类体中的函数声明前加上关键字static 以及不能声明为const 或volatile 之外与非静态成员函数相同,出现在类体外的函数定义不能指定关键字static. const string str = "liangxueliang"; |
|
来自: WUCANADA > 《c plus plus》