
假设有个类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))
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)