当我阅读c ++代码时,我会看到“ClassName ClassName :: FunctionName”形式的代码。例如:
Fraction Fraction:: Reciprocal() {
return Fraction(denominator,numerator);
}
在上面,Fraction是一个类名,Reciprocal()是在fraction类中声明的函数,并且有一个带有两个参数的构造函数。使用这种格式有什么重要意义?
答案 0 :(得分:6)
在C ++中,如果在类定义之外实现成员函数,则需要指出(除了返回类型和参数类型之外)您正在编写的函数确实是成员函数。如果你写了
Fraction Reciprocal() {
// ...
}
然后C ++会将其解释为好像您编写了一个名为Reciprocal
的自由函数(不是成员函数)。另一方面,写作
Fraction Fraction::Reciprocal() {
// ..
}
告诉C ++你正在实现嵌套在Fraction
内的东西。
::
表示法称为作用域解析运算符。可以把它想象成文件路径中的/。如果您将Fraction
视为文件夹并将Reciprocal
,成员函数视为该文件夹中的文件,那么您可以将上述代码视为
Fraction // returns a Fraction
Fraction::Reciprocal() { // function name is Reciprocal; it's declared inside Fraction
...
}
答案 1 :(得分:2)
这种组合没有任何重要或特殊之处。正如你似乎相信的那样,它没有任何特殊意义。它是普通的日常普通成员函数定义,与任何其他C ++成员函数定义没有任何明显区别。
其含义遵循C ++语言的基本规则。此
Fraction Fraction::Reciprocal() {
...
是来自班级Reciprocal
的方法Fraction
的定义。此方法的返回类型为Fraction
。因此,类Fraction
的方法返回同一个类Fraction
的实例 - 没有什么奇怪的,不寻常的或特殊的。
定义的其余部分只是将该实例构造为Fraction(denominator,numerator)
并返回它。同样,这是创建类Fraction
的临时实例的普通日常方法。
所以,回答你的问题:没有什么"重要的"关于这个"格式"。没有特殊的格式"这里有任何类型,只是一堆简单的C ++特性,彼此完全无关。一切都非常简单和基本。任何基本的C ++书籍都会对这些功能进行解释。
P.S。可以注意到,像这样的方法是声明const
Fraction Fraction::Reciprocal() const {
...
但这是一个单独的问题。
答案 2 :(得分:2)
这意味着First Fraction表示返回类型,就像void,double,int等....你正在返回Fraction,第二个Fraction是让编译器知道函数Reciprocal()是来自分数类,就是它,不要被它看起来的方式所捆绑,它很简单,如果你想要阅读更多它试着获得“绝对c ++”它是一本好书。
答案 3 :(得分:0)
您应该了解方法和功能的工作原理。上面的代码是Fraction类的一个方法,它返回一个Fraction对象。
这种方法的意义在于,它不是修改自身,而是修改新的分数并输出,使其自身完全相同。
使用这样的方法在数学上下文中非常有用,例如Matrices或Trees,因此您可以对某些对象执行数学运算而无需实际修改对象。
答案 4 :(得分:0)
因为您要返回Fraction
对象:
Fraction Fraction::Reciprocal() {
return Fraction(denominator,numerator);
} // ^^^^^^^^
返回类型为:
Fraction Fraction::Reciprocal() {
//^^^^^^^^
由于Reciprocal()
方法位于Fraction
类内,您正在编写该方法所属的类,然后::
运算符才能访问它:
Fraction::Reciprocal()
//^^^^^^^^^^