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

C++ 类操作符重载笔记

2015-09-13 13:51 344 查看
不能改变操作符优先级
不能改变操作符的结合性
不能改变操作符所需要的操作数
不能创建新的操作符

对于二元操作符重载,如果操作符左边是类 那么就在该类内部成员函数重载操作符即可
如果操作符左边不是类,而是一个常量,那么就必须在类的外部定义一个操作符重载函数

有一个最基本条件 一定有一个一元是一个自定义的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: