gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:24:36 24 4
gpt4 key购买 nike

我是新手,正在学习 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 下用 4.2.1 的 g++ 版本编译这个程序

谢谢!

最佳答案

在您的第一种情况下,这与重载无关,A 中的那两个test 函数正在重载,但是,test BA 中的 name hiding 因为 B 重新定义了 test . 重载 处理同一范围内的函数,名称隐藏 是在讨论类层次结构。

所以在第一种情况下

b1.test(b2);

b2B 的对象,B 中的test 函数需要类 的const 引用>A,在这种情况下是可以的,所以它会输出“BA”。

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

如果在 B 中添加另一个 operator=:

void operator=(B const &B) { cout << "BB" << endl; }

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

关于C++:重载函数和运算符的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15714547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com