C ++:重载函数和运算符的不同行为

时间:2013-03-30 03:13:27

标签: c++

我是新手并学习C ++。 我对类的函数重载有疑问。

除了函数名称之外,我有两个完全相同的代码。 一个是功能,另一个是操作员。

#include <iostream>

using std::cout;
using std::endl;

class B;

class A {
  public:
    void test(A const &a) { cout << "AA" << endl; }
    void test(B const &b) { cout << "AB" << endl; }
};

class B : public A {
  public:
    void test(A const &a) { cout << "BA" << endl; }
};

int main() {
  B b1;
  B b2;
  b1.test(b2);
  return 0;
}

此程序打印

BA

这是另一个程序。

#include <iostream>

using std::cout;
using std::endl;

class B;

class A {
  public:
    void operator=(A const &a) { cout << "AA" << endl; }
    void operator=(B const &b) { cout << "AB" << endl; }
};

class B : public A {
  public:
    void operator=(A const &a) { cout << "BA" << endl; }
};

int main() {
  B b1;
  B b2;
  b1.operator=(b2);
  return 0;
}

此程序打印

AA

这两个程序之间的唯一区别是函数名称:test和operator =。 我不明白为什么C ++会像这样。 有什么我想念的吗?

我正在使用mac OS X 8.2下的g ++版本4.2.1编译该程序

谢谢!

1 个答案:

答案 0 :(得分:3)

在您的第一个案例中,它不是overloadingtest中的两个A函数正在超载,test BA {1}} name hidingB,因为test重新定义了overloadingname hiding处理同一范围内的函数b1.test(b2); 正在讨论类层次结构。

所以在第一种情况下

b2

Btest的对象,B中的A函数需要类B的const引用,在这种情况下这是正常的,所以它将输出“BA”。

在第二个赋值运算符的情况下,您没有创建赋值运算符来将B赋值给A,因此编译器为您创建了一个。编译器创建的是调用AA的赋值运算符。因此,会打印operator=

如果您在B中添加另一个void operator=(B const &B) { cout << "BB" << endl; }

{{1}}

您将在赋值运算符的情况下看到“BB”,因为在这种情况下,编译器不会为您生成赋值运算符。