求助,C++中为什么有些函数只能用成员函数重载,而有些函数则只能用友元函数重载,其本质原因是什么?
2017-03-27 20:56
671 查看
操作符重载函数,仍然是一个成员函数。和普通的成员函数调用一样。我们知道,类的成员函数必须通过对象才可以调用,比如“[ ]” 运算符。 class test{ public: int operator[](int pos); };要调用 [] 运算符重载成员函数,必须有一个test的对象,否则无法调用。所以它必须是成员函数。
有一些运算符即可以友元,也可以用成员函数,比如 "+"。
class test{
public:
test& operator+(const test& o_o); //这样定义成成员函数,就有test的对象来调用。
friend test& operator+(test& , const test &); //用友元,就是操作两个test的对象。
};
有些运算符因为有特殊的要求,必须用友元。比如 string类。当你定义一个string对象时,可以用。
string str = "test";
string ok = "testtest" + str;
//这样的运算符必须是友元,因为它的第一个参数是char* 类型,相当于调用 operator (char *, string str)
string oook = str + "testset"; //这个就必须是成员函数,因为第一个str+ 表示调用str的成员函数operator+(char* )
相关文章推荐
- 流运算符为什么不能重载为成员函数,只能用友元函数重载
- 流运算符为什么不能重载为成员函数,只能用友元函数重载
- C++语言笔试题目 C++中为什么用模板类&& 类中如何使用const &&函数重载,我们靠什么来区分调用的那个函数?靠返回值判断可以不可以
- C++成员函数重载、覆盖和隐藏的区别
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C++成员函数的重载、覆盖与隐藏
- 第八章 C++函数的高级特性(8.2 成员函数的重载、覆盖与隐藏)
- 汇编告诉你为什么c++可以对函数重载
- C++ VS C#(12):函数的重载,类成员的static修饰,属性
- C++小知识:const成员函数与非const成员函数可以重载
- C++里的静态成员函数(不能用const的原因+static在c++中的第五种含义)(转)
- 为什么C++中,线程控制函数往往是静态成员函数?【转】
- 为什么C++成员函数不能作为C-Style回调函数?
- C++成员函数的重载、覆盖与隐藏
- C++成员函数的重载、覆盖与隐藏
- C++成员函数的重载、覆盖与隐藏
- C++中inline函数的定义为什么要放在头文件中?头文件中“只定义一份”是什么意思?const object 和inline函数是“一次定义规则”
- C++成员函数的重载、覆盖与隐藏
- C++成员函数的重载、覆盖与隐藏
- C++中什么成员函数可以称之为Trivial