c++中运算符=为什么必须重载为类的成员函数

c++中运算符=为什么必须重载为类的成员函数,第1张

假设有个类A,如下语句:A a;A b=a;

这时候的复制运算符会起作用,而且是以成员函数被调用的,等价于boperate=(a)。如果不是成员函数,那么不能这样使用。另外,必须重载说法是有问题的,只有类里面有指针成员的时候才需要重载

楼主你好, 是可以的

当然, 如果不是友元 和 成员函数,就不能访问类的私有数据了

除非你将某些数据定义成了共有成员(但是这样就不符合数据隐藏了)

举个例子:

class Time{

public:

int k;

Time() {k=1;}

}

int operator /(Time &a, int b){

ak = b;

return ak;

}

int main(){

Time test;

int a = test / 2;

cout<< a; // 这里会输出2的

}

程序员一般不会如此 *** 作, 因为 这违反了 类设计的 初衷。

C++规定:重载后的运算符至少有一个 *** 作数是用户自己定义的类型。这是为了防止用户为标准类型重载运算符。因此,不能将-减号运算符重载为两个double变量的和。

在C++中有什么是用户自己定义的类型呢?

一是类, 二是结构体, 第三种勉强能算上的是 枚举enum

下面这四个运算符 只能通过成员函数重载, 剩余的运算符都可以通过成员或非成员函数重载。

=: 赋值运算符

():函数调用运算符

[]:下标运算符

->:通过指针访问类成员的运算符。

每个”可重载的运算符来说,它既可以重载为友元函数,又可以重载为成员函数,还可以重载为非成员函数

一些运算符(如下标运算符[],函数调用运算符(),赋值运算符=等)只能重载为成员函数,而左 *** 作数为std::cout或std::cin的输入输出运算符只能重载为非成员函数

是否是友元函数是否是成员函数是两个相互交叉的分类标准

这个问题你不该在这里问,不是由我们设计C++的,老外有老外的想法。

你这么想知道也可以提供几个选项:

1此运算符有两个参数,左参数为类恰好符合类成员调用 *** 作符的条件,作为成员函数,它充分确保了只能访问类内的成员;如果是友元,需要设置两个参数,这里会产生一些误会,由于C++继承的存在,友元的两个参数调用会有问题出现不清楚的状况,即基类的成员模糊调用的情况,这不利于程序设计,其他的几个类似的 *** 作符也有这种情况,由于需要引用类内的成员,容易混淆细节。

2所谓的只能重载为类成员的 *** 作符有四个=、[]、()、->,这几个其实都有共同特点,那就是涉及到了类数据成员的引用,虽然还有一个也是涉及到了引用,但是用ADT设计程序的话,我们更倾向于不使用指针,所以这四个可以说是比较常用的 *** 作符,如果说从类的基本属性也就是数据的封装来看,这种规定其实是这个程序设计方法的体现,友元函数对类的成员调用毕竟本身就有违数据封装的基本思想。

3其实,现代编程还有一个很重要的特点,那就是简便性,这是程序设计工程化的一个方案,我们设计的程序就是需要更容易理解且不容易出错,这种规定想来是为了确保这种编程思想的贯彻而设计的。

An assignment operator shall be implemented by a non-static member function with exactly one parameter Because a copy assignment operator operator= is implicitly declared for a class if not declared by the user (128), a base class assignment operator is always hidden by the copy assignment operator of the derived class (赋值 *** 作符应该实现为带一个参数的非静态成员函数。因为如果用户没有声明,(编译器)将隐式地为类声明一个拷贝赋值 *** 作符,基类的赋值 *** 作符总是被派生类的拷贝赋值 *** 作符隐藏。)

更具体的理由我也说不清楚,但如果声明为友元,一是可能和这个隐式声明冲突,二是因友元的灵活性,就不能限定赋值函数要求左值这个规定了,还可能使赋值 *** 作具有可交换性等等问题。

c++已经够复杂的了,拜托不要再异想天开了。

这个真还是没有总结过,不过我只知道这几种运算符不能重载:

1成员运算符:

2指针取内容运算法:

3作用域分辨符:::

4三目运算符: :

5sizeof()

先上题:下列运算符都可以被友元函数重载的是:

A) =,+,-,

B) [],+,(),new

C) ->,+, ,>>

D) <<,>>,+,

正确答案为D

在运算符重载,友元函数运算符重载函数与成员运算符重载函数的区别是:友元函数没有this指针,而成员函数有,因此,在两个 *** 作数的重载中友元函数有两个参数,而成员函数只有一个。

重载运算符的基本原则:

下面比较成员函数和非成员函数(友元函数)重载运算符

所以说,单目运算符建议选择成员函数。

下面是重点

=,(),[],->

原因很简单,会和编译器默认分配的运算符重载成员函数冲突,引发歧义。

我们知道友元函数不是类的成员函数,它只是类的“朋友“,具有访问把它声明为“朋友”的类的数据成员的权限而已。

那么当把赋值运算符重载为类的友员函数,在程序中执行类对象的赋值语句时,程序就会出现两种矛盾的选择。

程序是不允许有矛盾不确定选择的,所以当赋值运算符重载为类的友元函数时,编译器就会提示错误。

对于剩下的3个运算符 ->, [], () 为什么不能重载为友元函数,也是跟上面一样的道理。即编译器发现当类中没有定义这3个运算符的重载成员函数时,就会自己加入默认的运算符重载成员函数。

那么下面这个题的答案也就很明显了:

将x+yz中的“+”用成员函数重载,“”用友元函数重载应该写为:?

答案为:xoperator+(operator(y,z))

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/13493920.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存