静态成员变量和静态成员函数:
普通成员变量每个对象各有一份,而静态成员变量只有一份,被所有同类对象共享。
普通成员函数一定是作用在某个对象上的,而静态成员函数并不具体作用在某个对象上。
访问静态成员时,通过: 类名::成员名 的方式访问,不需要指明被访问的成员属于哪个对象或作用
于哪个对象。因此,甚至可以在还没有任何对象生成时就访问类的一个静态成员。非静态成员的访
问方式其实也适用于静态成员,但两者的效果并没有差别。
使用sizeof运算符计算对象所占用的储存空间时,不会讲静态变量计算在内。
静态成员变量本质上是全局变量。一个类,即使一个对象都不存在,其静态成员变量也存在。静态成
员函数并不需要作用在 某个具体的对象上,因此本质上是全局函数。
设置静态成员的目的是将某些和类紧密相关的全局变量和全局函数写进类中,形式上成为一个整体。
// 矩形类,需要时刻知道矩形总数个矩形总面积 #include <iostream> using namespace std; class CRectangle{ private: int w, h; static int totalArea; // 总面积 static int totalNumber; // 矩形总数 public: CRectangle(int w_, int h_){ w = w_; h = h_; totalNumber++; totalArea += w*h; } ~CRectangle(){ totalNumber--; totalArea -= w*h; } static void PrintTotal(){ cout << totalNumber << " , " << totalArea << endl; } }; int CRectangle::totalNumber = 0; int CRectangle::totalArea = 0; int main() { CRectangle r1(3, 3), r2(2, 2); CRectangle::PrintTotal(); r1.PrintTotal(); return 0; }
常量对象和常量成员函数:
如果希望某个对象值初始化之后就不再改变,则定义对象时可以在前面加上const关键字,使之成为
常量对象。
常量对象上可以执行常量成员函数,因为常量成员函数确保不会修改任何非静态成员变量的值。当常
量成员函数中出现了任何有可能修改非静态成员变量的语句,编译时就会出错。因此,常量成员函数
内部也不允许调用同类的其它非常量成员函数(静态成员函数除外)。
#include <iostream> using namespace std; class CTest{ private: int n; public: CTest(){ n = 1; } int GetValue() const { return n; } int GetValue(){ return 2*n; } }; int main() { const CTest object1; CTest object2; cout << object1.GetValue() << " , " << object2.GetValue() << endl; return 0; } // 输出结果:1 , 2
类还有常量型成员变量和引用型成员变量。这两种类型的成员变量必须在构造函数的初始化列表进行初始化
#include <iostream> using namespace std; int f; class CDemo{ private: const int num; int & ref; int value; public: CDemo(int n):num(n), ref(f), value(4){ } }; int main() { cout << sizeof(CDemo) << endl; cout << sizeof(const int) << endl; return 0; }