这四种操作符居然不能当作友元重载
来源:互联网 发布:腾讯云wordpress建站 编辑:程序博客网 时间:2024/06/05 10:21
赋值操作符(=),下标操作符([]),函数调用操作符(()),指针成员访问箭头(->)必须重载为类成员函数。
- Code:
- friend F operator=(const F& f1,const F&f2);//error C2801: “operator =”必须是非静态成员
- F operator=(const F& f){
- this->n = f.n;
- this->d = f.d;
- return *this;
- //return F(f.n,f.d);
- }
这样做就对了,这是什么原因呢?
在C++ primer14.4Assignments Operators这一节当中提到:
类赋值操作符接受类类型形参,通常,该形参是对类类型的const 引用,但也可以是类类型或对类类型的非 const 引
用。如果没有定义这个操作符,则编译器将合成它。类赋值操作符必须是类的成员,以便编译器可以知道是否需要合成一个。
真是这样的吗?让我们看看代码
- #include <iostream>
- using namespace std;
- class F{
- int n;
- int d;
- public :
- F(int n=0, int d=1):n(n),d(d){}
- friend ostream& operator<<(ostream& os, const F& f){
- os << '[' << f.n << '/' << f.d <<']'; //存在ostream缓冲区
- return os;
- }
- /*F operator=(const F& f){
- this->n = f.n;
- this->d = f.d;
- return *this;
- //return F(f.n,f.d);
- }*/
- };
- int main()
- {
- F f1(3,5),f2(11,7);
- cout << (f1 = f2);//这里将赋值重载函数去掉之后还是可以实现,这是因为合成的原因,编译器判断f1与f2类型相同,从而对其进行了合成
- return 0;
- }
在第 13.2 节中讲到:
大多数操作符可以定义为成员函数或非成员函数。当操作符为成员函数时,它的第一个操作数隐式绑定到this 指针。有些操作符(包括赋值操作符)必须是定义自己的类的成员。因为赋值必须是类的成员,所以this 绑定到指向左操作数的指针。因此,赋值操作符接受单个形参,且该形参是同一类类型的对象。右操作数一般作为 const 引用传递。
我们从这里了解到,C++封装的太结实,不透气啊
代码剖析:http://www.52rd.com/blog/Detail_RD.Blog_imjacob_17085.html
- 这四种操作符居然不能当作友元重载
- 操作符重载与友元函数
- C++操作符重载,友元;
- 重载操作符与友元
- c++友元实现操作符重载
- C++操作符重载 友元基础教程
- 操作符重载及友元函数
- 不能重载的操作符
- C++ 运算符流操作符重载和友元
- 操作符重载为成员函数还是友元函数?
- 友元继承、<模板类、重载操作符>
- C++学习之友元函数,操作符重载
- 类,友元函数 ,重载操作符(+, +=)
- 操作符重载和友元的关系
- C++之重载操作符与友元
- C++之操作符重载和友元学习笔记
- 友元函数实现左移右移操作符重载
- 类的操作符重载及友元函数
- 高职学生如何成为编程高手
- 如何找需求练技术
- oracle_10g安装文档(图文)
- 程序员
- 修炼编程的内功
- 这四种操作符居然不能当作友元重载
- HTML学习笔记[1]HTML的基本标记
- HTML学习笔记[2]文字与段落标记
- HTML学习笔记[3]使用图像
- HTML学习笔记[4]使用列表
- “User Profile Service 服务未能登录,无法加载用户配置文件”实战历程
- 第一篇笔记
- 哎呦
- 我的第一篇日志