范围解析运算符语义
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;
【讨论】:
抱歉这个问题。时隔多年再次阅读,正如评论中指出的那样,连我的脑都疼以上是关于范围解析运算符语义的主要内容,如果未能解决你的问题,请参考以下文章