【C++】static 关键字的特性 与 问题

定义

  • 声明为 static的类成员称为类的静态成员

  • static修饰的成员变量,称之为静态成员变量

  • static 修饰的成员函数,称之为静态成员函数

  • 静态成员变量一定要在类外进行初始化

下面一段代码证明 上述定义:

#include <iostream>

class MyClass {
public:
    static int staticMember; // 静态成员变量
    static void staticMethod() // 静态成员函数
    { 
        std::cout << "This is a static member function." << std::endl;
    }
};

int MyClass::staticMember = 0; // 在类外进行初始化

int main() {
    MyClass::staticMember = 10; // 修改静态成员变量的值
    std::cout << "The value of staticMember is: " << MyClass::staticMember << std::endl;
    MyClass::staticMethod(); // 调用静态成员函数
    return 0;
}

输出结果:

The value of staticMember is: 10
This is a static member function.

从代码可以看出,静态成员变量需要在类外进行初始化才能正常使用。静态成员函数可以通过类名直接调用,不需要实例化对象。


特性

  1. 静态成员 为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加 static 关键字,类中只是声明
  3. 类静态成员可用 类名::静态成员 或者 对象.静态成员 来访问。
  4. 静态成员函数 没有隐藏的this指针不能访问任何非静态成员
  5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制。

问题

1. 静态成员函数可以调用非静态成员函数吗?

答:是的,静态成员函数可以调用非静态成员函数,但需要通过 对象实例或指针 来访问非静态成员函数。

代码举例:

#include <iostream>

class MyClass {
public:
    void nonStaticFunction() {
        std::cout << "This is a non-static member function." << std::endl;
    }

    static void staticFunction() {
        std::cout << "This is a static member function." << std::endl;

        // 调用非静态成员函数
        MyClass obj;
        obj.nonStaticFunction();
    }
};

int main() {
    MyClass::staticFunction(); // 调用静态成员函数
    return 0;
}

输出结果:

This is a static member function.
This is a non-static member function.

在静态成员函数 staticMethod() 中,我们实例化了一个对象 obj,然后通过该对象调用了非静态成员函数 nonStaticMethod() 。需要注意的是,静态成员函数无法直接访问非静态成员变量,因为非静态成员变量属于对象的状态,而静态成员函数没有隐式的对象实例。如果需要访问非静态成员变量,还是需要通过对象实例或指针来访问

2. 非静态成员函数可以调用类的静态成员函数吗

答: 是的,非静态成员函数可以调用类的静态成员函数。

代码举例:

#include <iostream>

class MyClass {
public:
    static void staticFunction() {
        std::cout << "This is a static member function." << std::endl;
    }

    void nonStaticFunction() {
        std::cout << "This is a non-static member function." << std::endl;

        // 调用静态成员函数
        staticFuntion();
    }
};

int main() {
    MyClass obj;
    obj.nonStaticFunction(); // 调用非静态成员函数
    return 0;
}

输出结果:

This is a non-static member function.
This is a static member function.

你可能感兴趣的:(C++初阶知识,c++,开发语言)