重载操作符的定义:
返回类型 operator 操作符(参数列表);
不可重载的操作符:
:: . .* ?: //四种
重载操作符的使用:
举例如下:如果没有重载操作符,是不能直接判断str1==str2的。重载操作符可以使代码更简洁。
class String {
friend bool operator==(String &str1, String &str2);
private:
char* m_data;//字符串的长度不确定,使用指针动态分配内存
public:
String(char *x){
int len = strlen(x);
m_data = new char[len + 1];
strcpy(m_data, x);
}
};
bool operator==(String &str1, String &str2){//全局函数
return strcmp(str1.m_data, str2.m_data) == 0;
}
int main(){
String str1("Hello");
String str2("World");
if (str1 == str2){
cout << "same" << endl;
}
else{
cout << "not same" << endl;
}
system("pause");
return 0;
}
操作符可以定义成类成员函数,也可以定义成全局函数。
定义成全局函数时,要在类中声明为友元。
输入和输出操作符重载
重载输出操作符定义的语法格式:
ostream & operator << (ostream & out,const classType & obj){
out<< //输出内容
return out;
}
第一个参数是输出流 ostream 的引用,在该对象(out)上产生输出。
第二个参数是要输出对象的引用,参数可以是const,可以同时输出const对象和非const对象。
返回ostream对象的引用,是为了保证cout的连续输出特性。
重载输入操作符定义的语法格式:
istream & iperator >> (istream & in, classType & obj){
in >> //输入内容
return in;
}
第二个参数不能定义成const了
赋值操作符及其重载
赋值和拷贝构造函数是不同的
赋值发生在已有的两个对象之间。是用一个存在的对象的数据来设置另外一个对象。
拷贝构造函数是用一个已经存在的对象来生成一个新对象。
class myClass{...};
myClass c1("abc");//定义对象c1,调用构造函数
myClass c2(c1);//用c1创建c2,调用拷贝构造函数
myClass c3=c1;//用c1创建c3,调用拷贝构造函数
myClass c4;//定义对象c4,调用构造函数
c4=c3;//用c3给c4赋值,调用赋值函数。
浅复制和深复制
浅复制是完全按照内存中的数据内容进行的复制行为。
如A a(2); A b(a);
将a内存中的数据2原样复制到b中。就是浅复制。
浅复制对于指针是存在问题的。因为指针里面存放的是地址。如果使用浅复制,则就是让两个指针指向同一个内存。
所以对于指针需要使用深复制。
深复制就是将原指针指向的内存空间的内容复制到目标指针指向的新的内存空间。
String :: String(const String & str){
int len=strlen(str.m_data);
m_data=new char[len+1];
strcpy(m_data,str.m_data);
};
重载赋值操作符
类类型 & operator=(参数);
重载赋值操作符必须定义为类的成员函数。
类型转换函数
class String {
public:
operator char*(){//在函数名前面不能指定函数类型,
//函数没有参数。
//其返回值的类型是由函数名中指定的类型名来确定的。
//类型转换函数只能作为成员函数,因为转换的主体是本类的对象。
//不能作为友元函数或普通函数。
return m_data;
}
};
String s("Hello World");
char buffer[128];
strcpy(buffer,s);
上面这个例子中,strcpy函数的第二参数其实是需要一个char*
类型的。但是传了一个string
类型的。因为String定义了到char*
的转换。