为什么我需要使用::来表示函数是否是成员函数,但我不需要为实例变量这样做?我确实明白::用于区分独立函数和成员函数,但我仍然没有得到变量部分。我将举例说明我在说什么。
形状.h
# pragma once
class Shape {
private:
int height;
int width;
public:
Shape(int height, int width);
}
形状文件
#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
时,它怎么会理解我在说什么。
最佳答案
C++ 使用一个模型,除非另有说明,否则它最初假定所有内容都在与其声明的名称相同的 namespace /类中。所以,例如,如果你写
int getHeight() {
return height;
}
在 C++ 文件的顶层,编译器假定您在全局命名空间中声明了某些内容。这意味着
getHeight
是一个免费函数。然后,语句 return height;
在全局命名空间中的自由函数的上下文中被解释——它将开始搜索 height
的局部变量,然后是全局命名空间中的全局变量。另一方面,如果你写
int Shape::getHeight() {
return height;
}
你明确地告诉 C++ “嘿,我知道这段代码在顶层的全局命名空间中,但我明确指出这实际上是在
Shape
类中。”那时,编译器会说“啊,明白了,你现在在 Shape
里面”并解释编写的代码,就像它在 Shape
里面一样。从这个意义上说,语句 return height;
首先开始查找名为 height
的局部变量,然后查找名为 Shape
的 height
数据成员,然后查找名为 height
的全局变量。C++ 必须以这种方式做事没有根本原因,但它有一个很好的内部一致性。除非某些内容明确地将您移至不同的范围级别,否则您将停留在出现语句或定义的任何“范围级别”。因此,一旦您以某种方式声明了该函数,即它在
Shape
中,它内部的所有内容都会相对于 Shape
而不是全局命名空间进行评估。希望这可以帮助!
关于c++ - 需要::为函数指定类而不是变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62377188/