C++ 类操作符重载笔记

来源:互联网 发布:单片机原理图怎么看 编辑:程序博客网 时间:2024/05/17 08:06
不能改变操作符优先级
不能改变操作符的结合性
不能改变操作符所需要的操作数
不能创建新的操作符

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

有一个最基本条件  一定有一个一元是一个自定义的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


0 0