C++学習ノートの演算子をリロードします

23792 ワード

演算子のリロード:1.演算子をリロードする、演算子を新たに定義するルール(例:前の演算子+の役割が加算であるが演算子によってリロードされた場合、加算をマイナスまたはその他の意味に変更し、後に「+」番号を呼び出すと、指定の意味が行使される).ほとんどの演算子をリロードできます.以下を除きます.:,?:,sizeofこれらはリロードできない3.演算子のリロードは、基本的にクラスおよび構造に表示されます.4.演算子の再ロードが完了したら、元の演算規則を満たす.演算子は、関数のリロードにも相当します(関数名を呼び出すことです).
演算子のリロード:operator演算子のリロード:次のプログラムで演算子の前++と後++とリロードされた-番号と+番号がリロードされます.
#include
using namespace std;
class Person
{
	public:
	int a;
	Person(int x)
	{
		a=x;
	}
	int fun(Person &p);
	{
		return this->a+p.a;
	}
	int operator+(const Person &p)// const                 
	{	
		return this->a+p.a;		
	}
	int operator-(const Person &p)
	{
		return this->a-p.a;
	}
	// &,          ,          ,     
	//   
	Person &operator++()
	{
		this->a++;
		return *this;//          
	}
	//   
	Person &operator++(int)
	{
		Person temp=*this;
		this->a++;//        
		return temp;//         
	}
};
//             
int main()
{
	Person p1(10);
	Person p2(20);
	cout<<p1<<"\t"<p2<<endl;
	int c=p1+p2;//      
	c=p2-p1;//      
	++p1;//       
	//     +     
	++p1;
	cout<<c<<endl;
	cout<<p1.a<<endl;
	system("pause");
	return 0;
}

等号の演算子のリロードはいつ等号のリロードに使いますか?オブジェクトがメモリの書き込みを申請する必要がある場合、等号の再ロードが必要です.一般的な等号は、オブジェクトがオブジェクトに値を付与した場合にエラーが報告されます.ここでは、ポインタが同じアドレスを指すエラーに関連しているため、前のオブジェクトが後から構造関数を呼び出して内蔵を解放すると、割り当てられたオブジェクトはどこを指すか分かりません.そのため、エラーが発生します.
#include
using namespace std;
class Person
{
	char *p;
public:
	Person()
	{
		p=NULL;
	}
	Person(char *str)
	{
		p=new char[strlen(str)+1];
		strcpy(p,str);
	}
	void fun()
	{
		cout<<p<<endl;
	}
	~Person()
	{
		if(p!=NULL)
		{
			delete[]p;
			p=NULL;
		}
	}
	Person &operator=(const Person&x)
	{
		//                  ,    
		if(this->p!=NULL)
		{
			delete[]this->p;
			this->p=NULL; 
		}
		this->p=new char[strlen(x.p)+1];
		strcpy(this->p,x.p);
		return *this;
	}
};
void text()
{
	Person p1("lijiamin");
	Person p2;
	p2=p1;
	p1.fun();
	p2.fun();
}
int main()
{
	text();
	system("pause");
	return 0;
}

かっこさいか
#include
using namespace std;
class Person()
{
public:
	void operator()(int a,int b)
	{
		cout<<"who l am"<<endl;
	}
};
int main()
{
	Person p1;
	p1(1,2);
	system("pause");
	return 0;
}

インテリジェントポインタ:newから出てきたオブジェクトを管理し、このオブジェクトにメモリを自動的に解放させるのが、このオブジェクトがインテリジェントポインタの役割を果たしていることです.
#include
using namespace std;
class Person
{
	int id;
public:
	Person(int x)
	{
		id=x;
	}
	~Person(){cout<<"   "<<endl;}
	void getID()
	{
		cout<<id<<endl;
	}
};
class smartPointer
{
	Person *p;//       
publicsmartPointer(Person *x)
	{
		p=x;
	}	
	~smartPointer()
	{
		if(p!=NULL)
		{
			delete p;
			p=NULL;
		}
	}
	//  ->
	Person *operator->()
	{
		return this->p;
	}
	//  *
	Person& operator*()
	{
		return *this->p;
	}
};
void text()
{
	//            , SP->,  (*SP)   
	smartPointer sp(new Person(100));
	sp->getId();
	(*sp).getId();
} 
int main()
{
	text();
	system("pause");
	return 0;
}

このセクションの内容は、オブジェクトとオブジェクトの間で変数のように直接演算できないため、演算子を再ロードし、演算子の内容を再設計して、オブジェクトの適用にエラーがない程度にする必要があります.