您的位置:首页 > 编程语言 > C语言/C++

c++运算符重载

2017-06-02 11:17 253 查看
c++运算符重载实质上是函数重载;       运算符重载分为两大类,一:运算符重载作为类的成员函数,此时,该函数的参数个数比原操作数要少1个。这是由于作为成员函数,该类对象隐式作为左操作数。       二:运算符重载在全局,此时,该重载函数的参数个数和原操作数一致。如:
class A
{
public:
A(int
d):data(d){}
Aoperator+(A&);//成员函数
Aoperator-(A&);
Aoperator*(A&);
Aoperator/(A&);
Aoperator%(A&);
friendA operator+(A&,A&);//友元函数
friend Aoperator-(A&,A&);
friend Aoperator*(A&,A&);
friend Aoperator/(A&,A&);
friend Aoperator%(A&,A&);
private:
int data;
};
//成员函数的形式
A A::operator+(A&a)
{
return A(data+a.data);
}
A A::operator-(A&a)
{
return A(data-a.data);
}
A A::operator*(A&a)
{
return A(data*a.data);
}
A A::operator/(A&a)
{
return A(data/a.data);
}
A A::operator%(A&a)
{
return A(data%a.data);
}
既然是作为类的成员函数,那么调用时候的写法有:
A a,b;
a.operator%(b);//也可以写成a%b;
//友元函数的形式 在外部重载
Aoperator+(A&a1,A&a2)
{
return A(a1.data+a2.data);
}
Aoperator-(A&a1,A&a2)
{
return A(a1.data-a2.data);
}
Aoperator*(A&a1,A&a2)
{
return A(a1.data*a2.data);
}
Aoperator/(A&a1,A&a2)
{
return A(a1.data/a2.data);
}
Aoperator%(A&a1,A&a2)
{
return A(a1.data%a2.data);
}
另外 自增自减运算符
A&operator++();//前置++
Aoperator++(int);//后置++
A&operator--();//前置--
Aoperator--(int);//后置--
内存运算符的重载void*operatornew(size_tsize);void*operatornew(size_tsize,inti);void*operatornew[](size_tsize);voidoperatordelete(void*p);voidoperatordelete(void*p,inti,intj);voidoperatordelete[](void*p);以上这些都有两种重载形式,既可以作为类的成员函数,又可以作为非成员函数。类型转换运算符只能作为类的成员函数
operatorchar*()const;
operatorint();
operatorconstchar()const;
operatorshortint()const;
operatorlonglong()const;
因为:运算符重载就是函数重载,要遵循函数重载的原则,不能改变原有的运算符的功能,只是在原来的功能上,新增了新的功能。而类型转换运算符重载为全局函数,那么会和原本的功能产生二义性,所以,它们只能重载作为类的成员函数。重载指向(->)操作符,与众不同,它表现的像二元操作符一样,一个对象名和一个成员名,但不管,表现怎么样,重载指向操作符时,因为->右操作数是成员,所以不接受参数。(是由编译器获取成员工作)c++规定 =,[],(),->这四个运算符只能被重载为成员函数。这是因为重载为友元函数会与原来的功能冲突。
运算符重载规则:
1、C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已经有的运算符。2、重载之后运算符的优先级和结合性都不会改变3、运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造,一般来讲,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。    注意:不能重载的运算符只有5个,它们是类属关系运算符“.”、成员指针运算符“.*”、作用域分辨符“::”、sizeof运算符和三木运算符“?:”。前面两个运算符保证了C++中访问成员功能的含义不被改变。作用域分辨符和sizeof运算符的操作数是类型。重载函数要意义明确,不能产生二义性。new operator和opeartor new的差别?
例子 string *ps = new string("memory management");
这里使用的new是所谓的new operator,它实际上做两件事:一是分配内存,二是调用一个constructor(构造函数);new operator总是做这两件事;我们能改变的是它分配内存的行为,也就是operator new,它只分配内存和malloc一样;
new operator里包含operator new,即先调用使用new时(new operator),先通过operator new分配内存,然后在调用
constructor(构造函数),我们能重载的实际上是operator new 分配内存的行为。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: