C++中,双冒号运算符::和点运算符.不同的用途和含义

#include 
using namespace std;

class Dog {
public:
    static void staticBark() {
        cout << "Static bark!" << endl;
    }

    void bark() {
        cout << "Non-static bark!" << endl;
    }
};

int main() {
    // 1
    Dog::staticBark();

    // 2
    Dog dog;
    dog.bark();

    // 3
    Dog.staticBark();
    
    // 4
    Dog.bark();
    
    return 0;
}

为什么3和4不行?

1 使用Dog::staticBark();调用静态成员函数staticBark()是合法的。这是正确的语法,使用类名和作用域解析运算符::调用静态成员函数。

2 创建一个Dog对象dog,然后使用dog.bark();调用非静态成员函数bark()是合法的。由于非静态成员函数与特定对象相关联,需要通过对象来调用。

然而,下面的情况是不合法的:

3 使用Dog.staticBark();调用静态成员函数staticBark()是不合法的。在C++中,不能使用类名直接调用静态成员函数,而应该使用作用域解析运算符::来调用。

4 使用Dog.bark();调用非静态成员函数bark()是不合法的。非静态成员函数需要通过对象来调用,而不是通过类名。

在C++中,双冒号运算符::和点运算符.有不同的用途和含义。

作用域解析运算符:::

  • 用于访问命名空间中的成员、类的静态成员、枚举成员、类的嵌套类型等。
  • 例如,namespace::member用于访问命名空间中的成员,ClassName::staticMember用于访问类的静态成员,ClassName::NestedType用于访问类的嵌套类型。

点运算符.:

  • 用于通过对象访问成员,包括非静态成员函数、非静态成员变量等。
  • 例如,object.memberFunction()用于调用对象的非静态成员函数,object.memberVariable用于访问对象的非静态成员变量。

总结区别:

  • 用于作用域解析,访问命名空间、类的静态成员和嵌套类型等。
  • 用于通过对象来访问成员,包括非静态成员函数和非静态成员变量。

你可能感兴趣的:(c++,开发语言,java)