不能改变操作符优先级
不能改变操作符的结合性
不能改变操作符所需要的操作数
不能创建新的操作符
对于二元操作符重载,如果操作符左边是类 那么就在该类内部成员函数重载操作符即可
如果操作符左边不是类,而是一个常量,那么就必须在类的外部定义一个操作符重载函数
有一个最基本条件 一定有一个一元是一个自定义的C++类
如果两个都是基本数据类型那么是非法的
//操作符重载
mystringoperator=(constmystring&it){
cout<<"=operator"<<endl;
strcpy(s,it.s);
return*this;
}
mystring str1;
mystring str2;
str2 = str1; //这里就是一次操作符重载
str2.operator = (str1); //这是完整版
操作符重载多个 写在类外面 不能用this 所以最好做上友元
mystringoperator+(constchar*str,constmystring&it){
mystringstr1;
charbuf[1024]={0};
sprintf(buf,"%s%s",str,it.s);
strcpy(str1.s,buf);
returnstr1;
};
mystringstr3;
str3="AAAA"+str1; //可以实现从前面重载 并且重载2个值
重载 ==
bool operator ==(const mystring &it) {
if (strcmp(s, it.s) == 0) return true;
return false;
}
二元重载 写在类外面
friend bool operator ==(const char *str, const mystring &it); //先做个友元
bool operator ==(const char *str, const mystring &it) {
if (strcmp(str, it.s) == 0) return true;
return false;
};
“aa” == str1;
++ 和 --操作符有点特别
str++ 和普通重载一样 但是参数必须是固定的
void operator ++(int i) {
s[0]++;
}
++str 必须写在类外面 通过友元访问类属性
friend void operator ++(mystring &it);
void operator ++(mystring &it) {
int len = strlen(it.s);
for (int i = 0; i < len; i++) {
it.s[i]++;
}
}
重载 new 和 delete 必须是成员函数 不能在外面重载
delete 必须返回 void
new 参数必须是 size_t
重载new 必须和 operator有一个空格 而且参数必须是 size_t 类型的一个参数
void * operator new(size_t size){
mystring *p = (mystring *)malloc(size);
return p;
}
如果你重载了 new 那么必须重载delete delete参数必须是个无类型的指针
void operator delete(void *obj) {
free((mystring *)obj);
obj = NULL;
}
重载 new[] 和 delete[] 函数参数也是必须按照格式来写
重载new[] 会多4个字节 是让他删除的时候能正常的删除掉
void * operator new[](size_t size) {
mystring *p = (mystring *)malloc(size);
return p;
}
void operator delete[](void *obj) {
free((mystring *)obj);
obj = NULL;
}
重载 []
char operator[](int index) {
return s[index];
}
重载()
void operator ()(const char *a)
{
strcpy(s,a);
}
强制转换
C++不但允许重载运算操作符,还可以重载强制类型转换操作符,不过强制类型转换必须是C++基本数据类型之一,如int,float,char *等,强制类型转换注意以下几点:
1、定义函数时不允许有参数,不允许有返回类型,但函数必须返回所需类型的值
2、重载函数只可以是类成员函数,不可以为非类成员函数
类强制转换成整数
operator int(){
return atoi(s);
}
实现起来是这样的
mystring s1;
s1("11111");
int i = (int)s1;
cout << i << endl; //转成11111了
可以重载的操作符
+ - * / % ^ & | ~
! = < > += -= *= /= %
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- ->* ‘ ->
[] () new delete new[] delete[]
不能重载的算符
. :: .* ?: sizeof