为什么我需要用途::来表示一个函数是否是成员函数,但我不需要为示例变量做这个操作。是用来区分独立函数和成员函数的,但是我还是不明白变量部分,我会给予一个例子来说明我在说什么。
形状. 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,这样编译器才能知道我在说什么,那么当我没有指定类的时候,它怎么能理解我在说什么呢?
2条答案
按热度按时间ie3xauqp1#
C++使用一个模型,在这个模型中,除非另有说明,否则它最初假定所有内容都与声明它们的内容在同一个名称空间/类中。
在C++文件的顶层,编译器假设你在全局名称空间中声明了一些东西,这意味着
getHeight
是一个自由函数,然后,return height;
语句在全局名称空间中的自由函数的上下文中被解释--它将开始搜索height
的局部变量,然后是全局名称空间中的全局变量。另一方面,如果你写
你显式地告诉C++“嘿,我知道这段代码在顶层的全局名称空间中,但是我显式地指出这段代码实际上在
Shape
类中。”这时,编译器会说“啊,明白了,你现在在Shape
中了。”并将编写的代码解释为在Shape
中。从这个意义上说,语句return height;
首先开始查找名为height
的局部变量,然后查找名为height
的Shape
的数据成员,然后查找名为height
的全局变量。C++必须这样做并没有什么根本原因,但它有一个很好的内部一致性。除非有什么东西显式地将你移动到不同的作用域级别,否则你会停留在语句或定义出现的任何“作用域级别”。因此,一旦你以一种表明它在
Shape
中的方式声明了函数,它内部的所有内容都相对于Shape
而不是全局命名空间进行计算。希望这有帮助!
6psbrbz92#
A
类作用域之外的值,你必须使用::
。