c++ 是否需要::为函数而不是变量指定类?

2cmtqfgy  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(135)

为什么我需要用途::来表示一个函数是否是成员函数,但我不需要为示例变量做这个操作。是用来区分独立函数和成员函数的,但是我还是不明白变量部分,我会给予一个例子来说明我在说什么。

形状. h

# pragma once

class Shape {

private:
  int height;
  int width;

public:
  Shape(int height, int width);
  int getHeight();
  int getWidth();
}

形状. cpp

#include "Shape.hpp"

Shape::Shape(int height, int width) {
  this->height = height;
  this->width = width;
}

int Shape::getHeight() {
  return height;
}

int Shape::getWidth() {
  return width;
}

在这里,我必须指定Shape构造函数的类和getter,这样编译器才能知道我在说什么,那么当我没有指定类的时候,它怎么能理解我在说什么呢?

ie3xauqp

ie3xauqp1#

C++使用一个模型,在这个模型中,除非另有说明,否则它最初假定所有内容都与声明它们的内容在同一个名称空间/类中。

int getHeight() {
    return height;
}

在C++文件的顶层,编译器假设你在全局名称空间中声明了一些东西,这意味着getHeight是一个自由函数,然后,return height;语句在全局名称空间中的自由函数的上下文中被解释--它将开始搜索height的局部变量,然后是全局名称空间中的全局变量。
另一方面,如果你写

int Shape::getHeight() {
    return height;
}

你显式地告诉C++“嘿,我知道这段代码在顶层的全局名称空间中,但是我显式地指出这段代码实际上在Shape类中。”这时,编译器会说“啊,明白了,你现在在Shape中了。”并将编写的代码解释为在Shape中。从这个意义上说,语句return height;首先开始查找名为height的局部变量,然后查找名为heightShape的数据成员,然后查找名为height的全局变量。
C++必须这样做并没有什么根本原因,但它有一个很好的内部一致性。除非有什么东西显式地将你移动到不同的作用域级别,否则你会停留在语句或定义出现的任何“作用域级别”。因此,一旦你以一种表明它在Shape中的方式声明了函数,它内部的所有内容都相对于Shape而不是全局命名空间进行计算。
希望这有帮助!

6psbrbz9

6psbrbz92#

  • 但不是变量 *。这是不正确的,如果你想得到A类作用域之外的值,你必须使用::
class A { 
    public:
        const static int a = 5;
        A (){}
};

int main (void) {
    std::cout << A::a;
}

相关问题