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.静态成员函数不能访问非静态成员函数和非静态数据成员;

 

posted @ 2019-09-29 00:19  ****l****  阅读(169)  评论(0编辑  收藏  举报