需要为函数指定类但不需要为变量指定类吗?

3

为什么我需要使用 :: 来表示一个函数是成员函数,但在实例变量方面我不需要这样做?我确实理解 :: 用于区分独立函数和成员函数,但我仍然不理解变量部分。我会举个例子来说明。

Shape.h

# pragma once

class Shape {

private:
  int height;
  int width;

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

Shape.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的类,以便编译器知道我在说什么。那么当我执行return height;this->height时,没有指定类,它是如何理解我所说的内容的。


这不是“需要引用函数”。它是为了非内联方法定义而需要的。如果方法在类声明中定义(变量定义的地方),则在这种情况下不需要使用“Shape::”。 - user2864740
隐式的this指针(为什么不需要使用“this->”来引用成员)是一个独立的问题。在SO上提问最好保持专注。 - user2864740
2
无论如何,这只是语法问题。在C++中,“Shape::”在这种情况下是必需的,以便编译器知道方法是为哪个类定义的 - 单个.cpp文件可以包含多个类的方法定义。其他语言完全依赖于“class {..}”作用域等来确定关联性。 - user2864740
@user2864740 谢谢你的解释。现在我有点能够想象出来了。 - Hat
你需要使用::来定义(静态)成员变量;这些只是比较少见的情况。 - Davis Herring
this->只是"必需的",因为您将类成员命名为函数参数(并选择不使用构造函数初始化列表) - M.M
2个回答

3

C++使用一种模型,它最初假定除非另有说明,否则所有内容都与声明它的命名空间/类相同。因此,例如,如果您编写

int getHeight() {
    return height;
}

在C++文件的顶层,编译器默认您正在声明全局命名空间中的内容。这意味着getHeight是一个自由函数。然后,语句return height;被解释为全局命名空间中的自由函数上下文 - 它将开始搜索本地变量height,然后在全局命名空间中搜索全局变量。
另一方面,如果您写入
int Shape::getHeight() {
    return height;
}

您明确告诉C ++:“嘿,我知道这段代码位于全局命名空间的顶层,但我明确指示这实际上在 Shape 类内部。”此时,编译器说“啊哈,你现在在 Shape 内部”,并解释为好像它是在 Shape 中编写的代码。从这个意义上讲,语句 return height; 首先开始查找名为 height 的局部变量,然后查找名为 height 的 Shape 数据成员,最后查找名为 height 的全局变量。
C ++没有必要以这种方式处理事情,但它具有良好的内部一致性。除非有些东西明确将您移入不同的作用域级别,否则您将保持任何“作用域级别”的语句或定义出现的位置。因此,一旦您以说明它在 Shape 中的方式声明了函数,函数内的所有内容都相对于 Shape 进行评估,而不是全局命名空间。
希望这可以帮助您!

请注意,这也与需要使用Shape::来访问类中的静态对象一致。 - Mooing Duck

1

但不是变量。这是不正确的,如果你想在A类的作用域外获取值,你必须使用::

class A { 
    public:
        const static int a = 5;
        A (){}
};

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

"...从A类的范围之外。" - Mooing Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接