范围解析运算符语义

Posted

技术标签:

【中文标题】范围解析运算符语义【英文标题】:scope resolution operator semantics [closed] 【发布时间】:2014-10-05 14:58:09 【问题描述】:

1) 作用域解析运算符在以下情况下有什么用,当我们也可以内联定义它时?

class Box

   public:
      double length;      // Length of a box
      double breadth;     // Breadth of a box
      double height;      // Height of a box
      double getVolume(void);// Returns box volume
;

double Box::getVolume(void)

    return length * breadth * height;

2) 此外,double Box::getVolume(void) 行的语义令人困惑。为什么不能:double getVolume(void)::Box。这背后有什么历史吗?

【问题讨论】:

这段代码没有任何意义。 简短而快速的回答。将函数体放在源文件而不是头文件中编译速度更快。 double Box::getVolume(void) 与运算符的所有其他用法一致。范围是Box,范围内的东西是getVolume。想“Box 包含getVolume”就像想“getVolume 属于Box”一样容易,所以我看不出一个比另一个更令人困惑。当然,Box 在您的示例范围内甚至没有 getVolume 函数。 如您所见,无法编译的示例代码不会在此处引起积极响应。 专业提示:制作函数double getVolume() const 【参考方案1】:

1) 在以下情况下,当我们也可以内联定义它时,范围解析运算符有什么用?

在您的示例中,在类中定义方法时不需要范围解析运算符:

class Box

   public:
      double length;      // Length of a box
      double breadth;     // Breadth of a box
      double height;      // Height of a box
      double getVolume(void)// Returns box volume
      
         return length * breadth * height;
      
;

但是,当函数在类之外定义时,程序员需要一种方法来将函数与给定类关联。该方法需要区分类方法和独立函数。因此范围解析运算符。

2) 此外,double Box::getVolume(void) 行的语义令人困惑。为什么不能: double getVolume(void)::Box 。这背后有什么历史吗?

实际上,当您考虑独立函数的声明语法时,语法并不令人困惑:

return_type function_name(function_parameters);  

包含的命名空间或类与函数名相关联,因此语法为:

return type class_name::function_name(function_parameters);  

如果您以不同的方式排列各个部分,则定义和声明可能不会那么混乱:

double
Box ::
getVolume(void)

  return height * length * depth;

【讨论】:

抱歉这个问题。时隔多年再次阅读,正如评论中指出的那样,连我的脑都疼

以上是关于范围解析运算符语义的主要内容,如果未能解决你的问题,请参考以下文章

C语言中有范围解析运算符吗?

范围解析运算符被使用了两次

:: c++中模板函数调用前面的范围解析运算符

范围解析运算符 :: 与成员访问运算符 。在 C# 中

具有范围解析和条件的 C++ 三元运算符

C++0x decltype 和范围解析运算符