运算符重载

C++允许类的对象的构造运算符实现单目或双目运算,这个特性叫做运算符重载.

对于每一个运算符,在C++都对应一个运算符函数operator@(@为C++各种运算符)

 

type operate@(arglist)

 

其中type为运算结果类型,arglist为操作数列表

不同情况下而不同运算符重载

 

在定义对象间的相互赋值时,重载运算符

在数字类型增加算术属性时,重载算术运算符

在定义的对象进行逻辑比较时,重载关系运算符

对于容器(container),重载"<<"和">>"运算符。

实现smart指针,重载指针运算符"->"

少数情况下重载new,delete运算符

 

重载运算符要遵守的规则:

1不能违反语言的语法规则

2重载满足操作的需要,哪怕原本不被编译器接受

3不能创造C++没有的运算符

4重载不能改变运算符的优先级

 

以重载=和+为例

 

// MyString.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> using namespace std; class MyString { private: char *str; public: MyString(char *s) { str=new char[strlen(s)+1]; strcpy(str,s); } ~MyString() { delete []str; } MyString& operator=(MyString &string) { if(this==&string) { return *this; } if(str!=NULL) { delete []str; } str=new char[strlen(string.str)+1]; strcpy(str,string.str); return *this; } MyString& operator+(MyString &string) { char *temp=str; str=new char[strlen(temp)+strlen(string.str)+1]; strcpy(str,temp); delete []temp; strcat(str,string.str); return *this; } void Print() { cout<<str<<endl; } }; int _tmain(int argc, _TCHAR* argv[]) { MyString a("Hello "); MyString b("everyone"); MyString c(""); c=c+a;//空字符连接了一个符a串 c.Print(); c=c+b; c.Print();//"前一字符串连上b串 c=a+b; cout<<"注意a串为:"; a.Print(); c.Print(); getchar(); return 0; } 

 

结果如下:

 

 

 

 

你可能感兴趣的:(c,String,null,delete,语言,编译器)