在这个学习过程中我对 static 的使用时常会混淆,因此整理,加深记忆

一、类的静态成员

   如果某个属性为整个类所共有,不属于任何一个具体对象,则采用 static 关键字来声明静态成员。

   • 由于静态数据成员不属于任何一个对象,因此可以通过类名对它进行访问。

     使用方法----- "类名::标识符“   (注意:static 数据成员的初始化要在类定义之外在加以定义)

  1.静态数据成员

#include<iostream>
using namespace std;

class Dog {
public:
    Dog(int age, int weight);
    void show();
    ~Dog() {}
private:
    static int number;
    int age, weight;
};
int Dog::number = 0;        //static 数据的定义【因为需要这种方式专门为它们分配空间,而非静态数据是与它们的所属对象一同分配空间的】

Dog::Dog(int age, int weight) {    //构造函数
    this->age = age;
    this->weight = weight;
    number++;
}

void Dog::show() {
    cout << "age: " << age << "" << "weight: " << weight <<"kg"<< endl;
    cout << "现在共有" << number << "只汪星人" << endl;
}

int main() {
    Dog dog(1, 20);
    dog.show();

    Dog dog2(2, 30);
    dog2.show();
    return 0;
}    

 不难发现当调用构造函数时 计算汪星人的数量的 number静态数据 做自增运算时,无论在哪个对象里number的值随上一次调用而继续加一。

 有个细节:static 数据类型 在定义时不给它设定值的化,系统默认为 0,而非静态数据类型则随机赋值。(ps:下面代码 14 行也值得注意)

 1 #include<iostream>
 2 using namespace std;
 3
 4 class Point {
 5 public:
 6     Point() {};
 7     void set(int x, int y);
 8     int getx() { return x; }
 9     int gety() { return y; }
10 private:
11     int x;
12     static int y;
13 };
14 int Point::y;            //切记,哪怕不给static类型 定义时赋初值,也需要在类外面定义【即分配空间】,否则会报错
15 void Point::set(int x, int y) {
16     this->x = x;
17     this->y = y;
18 }
19 int main() {
20     Point p;
21     cout << p.getx() << "   " << p.gety() << endl;
22     return 0;
23 }

  2.静态成员函数

静态成员函数可以直接访问该类的数据和函数成员,而访问非静态成员必须通过对象名
class A {
public:
    static void f(A a);
private:
    int x;
    static int y;
};
static int y;
void A::f(A a) {
    cout << x;          //错误
    cout << a.x;        //正确

    cout << y;      //直接访问static 数据正确
}

=============================================================================================

以上为现阶段的学习记录,如有错误希望指正 :)

02-10 22:11