我在一个类里重载了赋值运算符,把它声明为类的友元, 编译出错:"operator ="必须是非静态成员。

网上查了一下,知道了赋值运算符必须声明为成员函数,但不知道声明为友员时的那个报错是什么意思。
静态成员不是前面要加static 的吗,我声明为友员的时候又没有加static

c++中 有四个操作符不能是全局域中的重载,这四个操作符是:=, ->, operator[ ], operator()。
所以=的重载不能声明成类的友元。而且函数operator=默认是静态成员函数,所以只能访问静态数据成员
你没贴代码,我就举个例子吧:
class A {
public:
A &operator=(A &a); //ok 正确
friend A &operator=(const char *s); //错误,友元不属于成员函数
private:
int _size;
char *_string;
};

参考资料:c++primer

温馨提示:内容为网友见解,仅供参考
无其他回答

重载'='时报错:error C2801: 'operator =' must be a <Unknown> member...
这样写必须要用成员函数来重载,就是说去掉friend 如果要用友元来重载的话,需要两个POLY参数。推荐友元。

为什么赋值运算符只能作为成员函数进行重载,而不能作为友元函数重载...
C++规定=,[ ],(),->这四个运算符只能被重载为类的非静态成员函数,其他的可以被友元重载,主要是因为其他的运算符重载函数都会根据参数类型或数目进行精确匹配,这四个不具有这种检查的功能,用友元定义就会出错

重载 友元 还有&用法的疑问
是引用,你记住操作符重载语法就是这样了,operator=就相当于方法名,括号里面是参数。重载操作符后用法就是一个complex对象可以赋值给另一个complex对象,其他加减乘除操作符类似。这个友员的用法:complext c;cout << c << endl;当然除了cout,也可以输出到任何ostream对象,比如文件输出流 ...

为什么在C++中对赋值号“=”的重载只能使用成员函数而不可以使用友元函...
apple& apple::operator = (const apple & ap){xxxxxx},那么,假如将赋值运算符重载为友元形式,那么一些非左值(比如常量)会被编译器隐式转换成一个临时对象,这样非左值就会出现在=号左边,但是编译器并不会认为它出错,但是这样就破坏掉了=的语义,所以“=”只能重载为成员函数...希望对你有帮助。

'operator =' must be a <Unknown> member啥意思
假如将赋值运算符重载为Dog类的友元:friend Dog operator=( Dog &d1, Dog &d2){ d1.age = d2.age;return d1;} 例如有表达式 x = y;可以正确的将y赋值给x; x,y都是Dog类的对象。又例如有一表达式99 = y;它被解释为operator=(99, y);C++编译器将99转换为一个Dog类的对象(隐含...

黑马C++笔记 5.5 运算符重载
运算符重载与函数重载(Overload)不同,后者在同一个作用域中通过参数列表的不同来区分。Overload可以是成员函数或非成员函数,根据参数和类型选择调用。然而,派生类的虚函数重载(Override)则需确保函数签名一致,以明确覆盖基类行为。5.5.1 举例来说,我们可以重载加法运算符+,使其适用于自定义类型...

...和class的区别到底是什么?我在网上查到的是:除了他们的默认访问权限...
(1)都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;(2)都可以有一大堆public\/private\/protected修饰符在里边;(3)虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:A a = {1, 2, 3};不管A是个...

java 中的语法到底指的什么?
通常,当一个对象需要做“深拷贝”(钱能:《C++程序设计教程》)时,我们需要为它事先定义“拷贝构造函数”、“赋值运算符的重载函数”和“析构函数”;否则编译器将以“按位copy”的形式自动生成相应的缺省函数。倘若类中含有指针成员或引用成员,那么这三个默认的函数就隐含了错误 Java则没有这种语法...

友元函数在类的内部定义,在类的外部声明对吗?
把该函数声明为友元,声明方式是在被访问的类声明里声明该函数。必须在类内部声明,在类外部定义。原因如下:在内部定义函数,要用到其对象,此刻必须定义完整的类,但是类完整定义必须在右花括号出现后,故此刻会编译出错;同时还需要类先定义,再定义友元函数,原因如上。

...将运算符+=重载为适合复数的复合赋值运算。
一种将默认参数设为this 也就是调用函数的实体自身 另一种是 两个参数 读取两个实体

相似回答