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

标签 c++ class constructor scope

为什么我需要使用::来表示函数是否是成员函数,但我不需要为实例变量这样做?我确实明白::用于区分独立函数和成员函数,但我仍然没有得到变量部分。我将举例说明我在说什么。

形状.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 的局部变量,然后查找名为 Shapeheight 数据成员,然后查找名为 height 的全局变量。

C++ 必须以这种方式做事没有根本原因,但它有一个很好的内部一致性。除非某些内容明确地将您移至不同的范围级别,否则您将停留在出现语句或定义的任何“范围级别”。因此,一旦您以某种方式声明了该函数,即它在 Shape 中,它内部的所有内容都会相对于 Shape 而不是全局命名空间进行评估。

希望这可以帮助!

关于c++ - 需要::为函数指定类而不是变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62377188/

相关文章:

css - HTML 和 CSS 中的悬停问题

java - 如何解决 ClassNotFoundException?

c++ - Moodle REST 网络服务 : Problems sending an array as POST parameter

c++ - 这个模板语法非法吗?

c++ - 从 std::fstream 检索文件描述符

c++ - 如何更新对象的属性?

PHP 类作用域

java - 在构造函数和方法中调用 thread.start() 方法有什么区别

c# - 在同一类 c# 中使用构造函数调用构造函数并在同一构造函数中调用基础构造函数

c++ - 当存在其他构造函数时,如何强制创建默认序列构造函数?