“ClassName ClassName :: FunctionName”在C ++中的含义是什么?

时间:2016-02-26 19:36:58

标签: c++ class constructor

当我阅读c ++代码时,我会看到“ClassName ClassName :: FunctionName”形式的代码。例如:

Fraction Fraction:: Reciprocal() {       

    return Fraction(denominator,numerator);
}

在上面,Fraction是一个类名,Reciprocal()是在fraction类中声明的函数,并且有一个带有两个参数的构造函数。使用这种格式有什么重要意义?

5 个答案:

答案 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()
//^^^^^^^^^^