操作符重载一个原则是:被操作的数据类型中 至少有一个是自定义的类型(使用class定义类),如果被操作的变量都是基本类型,那么就不能定义操作符重载。
1.
如果重载了new,则必须重载delete,因为系统知道了你自定义了怎么new一个空间, 但是呢你使用delete的时候,系统并不知道怎么delete你所自定义申请的空间。
2.
类内定义与友元函数定义原则:
     对于二元操作符:二元操作符如果操作符左面是自定义类,那么直接在类里面实现重载函数即可;
     如果左边是标准变量(标准变量无法调用重载函数),右边是自定义类,那么就将重载函数设置为友元函数。重载函数在自定义类的外部定义实现。
3.

强制转化操作符重载:

  ØC++不但允许重载运算操作符,还可以重载强制类型转换操作符,不过强制类型转换必须是C++基本数据类型之一,如int,float,char *等,强制类型转换注意以下几点:
  Ø1、定义函数时不允许有参数,不允许有返回类型,但函数必须返回所需类型的值
  Ø2、重载函数只可以是类成员函数,不可以为非类成员函数
operator int()//不能指定返回值
{
return 整形变量;
}
operator int* ()
{
return 整形变量地址;
}

最后放代码:(分析代码才是最快的捷径)

#include <iostream>
#include<string.h>
#include<stdlib.h> using namespace std;
/*操作符重载一个原则是:被操作的数据类型,至少有一个是自定义的类型,
* 如果被操作的变量都是基本类型,那么就不能定义操作符重载*/
class mystring
{
public:
char *s; //一元操作符重载
//重载1
mystring operator=(const mystring &it)
{ memset(s,,);
strcpy(s,it.s);
return *this;
}
//重载2
mystring operator+(const mystring &str)
{
strcat(s,str.s);
return *this;
}
//重载3
mystring operator + (const char *str)
{
strcat(s,str);
return *this;
}
friend mystring operator + (const char *str,const mystring &it); //重载5
mystring operator +=(const char *str)
{
strcat(s,str);
return *this;
} //重载6:<<作为简单的赋值操作
void operator<<(const char *str)
{
strcpy(s,str);
} //重载7:>>作为简单的赋值操作
void operator>>(const char *str)
{
strcpy(str,s);
} //重载8:new(必须有空格)
/*如果重载了new,则必须重载delete,因为系统知道了你自定义了怎么new一个空间,
* 但是呢你使用delete的时候,系统并不知道怎么delete你所自定义申请的空间。*/
void * operator new(size_t size)
{
mystring *p =(mystring *)malloc(size);
return p;
} //重载9:delete
void operator delete(void *obj)
{
//free(obj) //C:语言不能直接free一个void*类型,他不知道有多大内存要释放
free((mystring*)obj);//使用强制类型转换
obj=NULL;//防止野指针
} //重载10:new[]
void *operator new[](size_t size)//size总比实际分配空间大4个字节,存放一些系统内部的处理数据,也就是delete[]释放内存所需要的数据
{
mystring *p=(mystring *)malloc(size);
return p;
}
//重载10;delete[]
void operator delete[](void *obj)
{
free((mystring*)obj);
obj=NULL;
} //重载11:==(左边是自定义类,是一元重载)
bool operator==(const mystring &it)
{
if(strcmp(s,it.s)==)//判断二者的字符串是否相等。
return true;
else {
return false;
}
}
//设置友元函数
friend bool operator==(const char* str,const mystring &it);
}; /*二元操作符:二元操作符如果操作符左面是类,那么直接在类里面实现重载函数即可,
如果左边是标准变量(标准变量无法调用重载函数)
右边是自定义类,那么就将重载函数设置为友元函数。
*/
//重载4
mystring operator + (const char *str,const mystring &it)
{
char buf[]={};
mystring str1;
sprintf(buf,"%s%s",str,it.s);
strcpy(str1,buf);
return str1;
} //重载12:==(左边是一个普通的变量类型),定义二元重载函数,在类内部需要设置友元函数
bool operator==(const char* str,const mystring &it)
{
if(strcmp(str,it.s)==)
return true;
else {
return false;
}
} int main()
{
mystring str1;
str1.s="hello"; //使用重载1
mystring str2 = str1;
cout<<str2.s<<endl; //使用重载1,2
mystring str3;
mystring str4;
str4.s=" C++";
str3 = str2 + str4;
cout<<str3.s<<endl; //使用操作符3
mystring str5;
str5.s="hello5 ";
str5=str5+"c++5";
cout<<str5.s<<endl; //使用重载8,9
mystring *str6 = new mystring;
delete str6; return ;
}

C++操作符重载总结operator(小结 更新ing)的更多相关文章

  1. C++ 友元(friend关键字)、类中的重载、操作符重载(operator关键字)

    C++ 中友元的用法: 1.在类中使用friend关键字声明 2.类的友元可以是其它类或者具体函数 3.友元不是类的一部分 4.友元不受类中访问级别的限制 5.友元可以直接访问具体类中的所有成员. 友 ...

  2. c++ 操作符重载和友元

    操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...

  3. C++一些注意点之操作符重载

    重载操作符需要注意 (1)重载操作符必须具有一个类类型操作数.不能重载内建类型的操作符. operator +(int,int);//这个是错误的,都为内建类型 operator +(int,clas ...

  4. 15.C++-操作符重载

    首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...

  5. 15.C++-操作符重载、并实现复数类

    首先回忆下以前学的函数重载 函数重载 函数重载的本质为相互独立的不同函数 通过函数名和函数参数来确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的函数重载 ...

  6. C#中如何利用操作符重载和转换操作符 (转载)

    操作符重载 有的编程语言允许一个类型定义操作符应该如何操作类型的实例,比如string类型和int类型都重载了(==)和(+)等操作符,当编译器发现两个int类型的实例使用+操作符的时候,编译器会生成 ...

  7. C++学习笔记-操作符重载

    操作符重载(operator overloading)是一种形式的C++多态,C++将操作符重载扩展到用户自定义的类型,如允许使用+将两个自定义的对象相加,编译器将根据操作数的数目和类型决定使用那种加 ...

  8. C++ 操作符重载 (operator)

    重载不能改变操作符的优先级 如果一个内建操作符是一元的,那么所有对它的重载仍是一元的.如果是二元的重载后也是二元的 下面看一个有代表性的例子:: 头文件Complex.h: #includeusing ...

  9. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

随机推荐

  1. 洛谷P1428 小鱼比可爱

    题目描述 人比人,气死人:鱼比鱼,难死鱼.小鱼最近参加了一个"比可爱"比赛,比的是每只鱼的可爱程度.参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只 ...

  2. 【模板】最大流模板(dinic)

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  3. 交互式编程之Golang基本配置(Jupyter-notebooks Golang)

    JupyterNoteBook-GO 启动错误 Install Go Install gophernotes 参考资料 如有错误,欢迎指出 错误 error: Cannot assign reques ...

  4. nyoj 803 大数问题

    #include<stdio.h> #include<string.h> #define ll long long #define N 110000 int main() { ...

  5. 工具-VS插件Resharper快捷键

    编辑Ctrl + Space 代码完成 Ctrl + Shift + Space代码完成Ctrl + Alt + Space代码完成Ctrl + P 显示参数信息Alt + Insert 生成构造函数 ...

  6. C#中的Socket

    ];//用于缓存客户端所发送的信息,通过socket传递的信息必须为字节数组 IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//本机预使用 ...

  7. Android-自己定义标题栏

    Android-自己定义标题栏 2014年4月25日 分享知识点 最近也比較多事情,想发发博客就是心有余而力不足,本篇博文主要教大家怎样实现自己定义标题栏,非常easy.那么聪明的你一下就看懂. 有兴 ...

  8. 《大话操作系统——做坚实的project实践派》(2)

      <大话操作系统--做坚实的project实践派>(2) 

  9. HDOJ 题目3518 Boring counting(后缀数组,求不重叠反复次数最少为2的子串种类数)

    Boring counting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. hdoj--1051--Wooden Sticks(LIS)

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...