c++运算符重载
来源:互联网 发布:文字解密软件 编辑:程序博客网 时间:2024/06/03 19:47
c++运算符重载实质上是函数重载;
运算符重载分为两大类,一:运算符重载作为类的成员函数,此时,该函数的参数个数比原操作数要少1个。这是由于作为成员函数,该类对象隐式作为左操作数。
二:运算符重载在全局,此时,该重载函数的参数个数和原操作数一致。如:
class A
{
public:
A(int d):data(d){}
- Aoperator+(A&);//成员函数
Aoperator-(A&);
Aoperator*(A&);
Aoperator/(A&);
Aoperator%(A&);
- friend A 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_t size);
- void*operatornew(size_t size,int i);
- void*operatornew[](size_t size);
- voidoperatordelete(void*p);
- voidoperatordelete(void*p,int i,int j);
- 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 分配内存的行为。
阅读全文
0 0
- C++-运算符重载
- [C++]重载运算符
- C#:运算符重载
- c++-++运算符重载
- C++:重载运算符
- 运算符重载(C++)
- [c++]运算符重载
- 【C++】运算符重载
- C++--------------------------------------------运算符重载
- C#:运算符重载
- C++:运算符重载
- C++:运算符重载
- C#:运算符重载
- [C++]运算符重载
- 【c++】运算符重载
- C++:运算符重载
- C#:运算符重载
- C++:运算符重载
- 总结遍历List时删除元素
- 【RabbitMQ】三种Exchange模式——订阅、路由、通配符模式
- Ubuntu14.04下安装Tensorflow遇到的问题
- 单例模式的几种写法(包含双检锁写法)
- POJ 3694 Network(Tarjan求割边+LCA)
- c++运算符重载
- C++ 操作EXCEL(OLE/COM)
- extract-text-webpack-plugin 的安装及配置
- ActiveMQ与Kafka对比
- android android-async-http https
- 树分块——BZOJ1086/Luogu2325 [SCOI2005]王室联邦
- 欢迎使用CSDN-markdown编辑器
- JSONObject to bean
- React native iOS App上架流程