函数调用结果

除非函数被声明为引用类型,否则函数调用的计算结果为右值。 具有引用返回类型的函数的计算结果为左值,并且可在赋值语句的左侧使用该函数,如下所示:

// expre_Function_Call_Results.cpp
// compile with: /EHsc
#include <iostream>
class Point
{
public:
    // Define "accessor" functions as
    // reference types.
    unsigned& x() { return _x; }
    unsigned& y() { return _y; }
private:
    unsigned _x;
    unsigned _y;
};

using namespace std;
int main()
{
    Point ThePoint;

    ThePoint.x() = 7;           // Use x() as an l-value.
    unsigned y = ThePoint.y();  // Use y() as an r-value.

    // Use x() and y() as r-values.
    cout << "x = " << ThePoint.x() << "\n"
         << "y = " << ThePoint.y() << "\n";
}

前面的代码定义一个称作 Point 的类,该类包含表示 xy 坐标的私有数据对象。 必须修改这些数据对象,并且必须检索其值。 该程序只是针对此类的多个设计之一;另一种可能的设计是使用 GetX 与 SetX 函数或使用 GetY 与 SetY 函数。

返回类类型的函数、指向类类型的指针或对类类型的引用可以用作成员选择运算符的左操作数。 因此,以下代码是合法的:

// expre_Function_Results2.cpp
class A {
public:
   A() {}
   A(int i) {}
   int SetA( int i ) {
      return (I = i);
   }

   int GetA() {
      return I;
   }

private:
   int I;
};

A func1() {
   A a = 0;
   return a;
}

A* func2() {
   A *a = new A();
   return a;
}

A& func3() {
   A *a = new A();
   A &b = *a;
   return b;
}

int main() {
   int iResult = func1().GetA();
   func2()->SetA( 3 );
   func3().SetA( 7 );
}

可以递归方式调用函数。 有关函数声明的详细信息,请参阅函数说明符成员函数程序和链接中提供了相关材料。

请参见

参考

后缀表达式