重载赋值运算符
赋值运算符重载用于对象数据的复制
operator=
必须重载为成员函数
重载函数原型为:类名 & 类名 :: operator=(const 类名 & );
定义name类的重载赋值运算符函数
#include <iostream>
#include <cstring>
using namespace std;
class name{
public:
name(char *pn);
name(const name & obj);//复制构造函数
name& operator = (const name & obj);//重载赋值运算符
~name();
protected:
char *pname;
int size;};
name::name(char *pn){
cout<<" Constructing "<<pn<<endl;
pname=new char[strlen(pn)+1];
if(pname!=0) strcpy(pname,pn);
size=strlen(pn);}
name::name(const name & obj){
cout<<" Copying "<<obj.pname<<" into its own block\n";
pname=new char[strlen(obj.pname)+1];
if(pname!=0) strcpy(pname,obj.pname);
size=obj.size;}
name & name::operator = (const name & obj){
if(this==&obj) return *this; //避免自赋值
delete []pname;
pname=new char[strlen(obj.pname)+1];
if(pname!=0) strcpy(pname,obj.pname);
size=obj.size;
return *this;}
name::~name(){
cout<<" Destructing "<<pname<<endl;
delete []pname;
size=0;}
int main()
{
name obj1("ZhangSan");
name obj0=obj1;//初始化对象调用复制构造函数
name obj2("LiSi");
name obj3("NoName");
name obj4("helloName");
obj4=obj3=obj2=obj1;//修改对象时调用重载赋值运算符
return 0;
}
重载运算符[ ]和( )
下标运算符[ ]和函数调用符( )是二元运算符,只能用成员函数重载,不能用友元函数。
1、由于数组中并没有保存其大小,因此不能对数值元素进行存取范围的检查,无法保证给数组动态赋值不会越界。利用C++的类可以定义一种更安全、功能强的数组类型。为此,为该类定义重载运算符[ ]。
在重载下标运算符函数是应注意:
(1)该函数只能带一参数,不可带多个参数。
(2)不得重载为友元函数,必须是非static的成员函数。
[ ]运算符用于访问数据对象的元素
重载格式:
返回值类型 类:: operator [ ] (类型)
解释为:x.opereator [ ] (y)
#include <iostream>
using namespace std;
class vector{
public:
vector(int n){
v=new int[n];
size=n;}
~vector(){
delete []v;
size=0;}
int & operator [](int i){
if(i>=0&&i<size)
return v[i];}//当重载运算符函数调用需要做左值时,应该返回引用
private:
int *v;
int size;};
int main()
{
vector a(5);
a[2]=12;
cout<<"vector(2) "<<a[2]<<endl;
return 0;
}