C++第三次作业static
c++的static
static对于C++的数据共享有着非常重要的作用。
在类中申明的static数据是从属于类而不是对象,也就是说所有的对象都拥有共同该数据信息:
#include<iostream> using namespace std; class Point { public: Point(int xx = 0, int yy = 0) { X = xx; Y = yy; countP ++; } Point(Point &p); ~Point() { countP --; } int GetX() { return X; } int GetY() { return Y; } void GetC() { cout << "Object id = " << countP << endl; } //输出静态数据成员 private: int X, Y; static int countP; //静态数据成员声明,用于记录点的个数 }; Point :: Point(Point &p) { X = p.X; Y = p.Y; countP ++; //在构造函数中对countP累加,所有对象共同维护同一个countP } int Point :: countP = 0; //静态数据成员定义和初始化,使用类名限定 int main() { Point A(4, 5); // 定义对象A,其构造函数会使countP增1 A.GetC(); //输出对象个数 Point B(A); //定义对象B,其构造函数会使countP增1 B.GetC(); return 0; }
总结:
对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷 贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共 用。所以,静态数据成员的值对每个对象都是一样的,
注意:静态成员的初始化在类的外面,因为这个静态成员不是属于对象,在对象没有实例化之前是不能通过对象去访问的,但是在外面可以直接通过类名就访问到
因为静态成员不需要类实例化就已经被分配了内存空间。
静态成员函数:
被static修饰过的静态成员函数与静态数据相似,不属于对象,而是属于类,要注意得是静态成员函数只能访问静态变量,非静态的访问不到。一般静态函数用来给静态变量初始化。
class A{ public: static void fun(A a); private: int x; }; void A :: fun( A a){ cout << x; //对x的引用是错误的 cout << a.x; //正确 }
这里已经可以很清晰的了解静态作用域的问题。
总结:
1.出现在类体外的函数定义不能指定关键字static;
2.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
3.非静态成员函数可以任意地访问静态成员函数和静态数据成员;
4.静态成员函数不能访问非静态成员函数和非静态数据成员;