不需要編譯器自己生成的函數,就應該明確拒絕
在C++類的設計中要注意防止類自身生成的函數對實際應用的干擾。舉個例子:一個表示個人信息的類,class PersonalInformation{ ..... };,對於個人信息,從原則上來說不可能一樣的,但是實際操作時候我們可能會出現PersonalInformation p1 = p2;這樣的assigned操作。這對於這個類毫無用處,而且會產生一些不必要的BUG。下面就介紹兩種方法來拒絕編譯器自己生成的函數(代碼均通過VS2008編譯運行)。
方法一、定義要屏蔽的函數爲私有函數,但是同時不實現它,在鏈接期拒絕
#include <iostream>
#include <string>
class PersonalInfor
{
public:
int show_ID(void )
{
std::cout<<personal_ID<<std::endl;
return NULL;
}
PersonalInfor(const std::string& id):personal_ID(id)
{}
private:
PersonalInfor(const PersonalInfor&);//定義要屏蔽的函數爲私有函數,但是同時不實現它
PersonalInfor& operator=(const PersonalInfor&);
std::string personal_ID;
};
int main()
{
PersonalInfor wang("2432222");
wang.show_ID();
PersonalInfor li = wang;//會提示cannot access private member declared in class 'PersonalInfor'
system("pause");
}
方法二、繼承一個專門阻止某動作的Base_class,在編譯器拒絕該行爲
#include <iostream>
#include <string>
class UnCopyable//定義一個阻止這個行爲的基類
{
protected://構造函數protected模式
UnCopyable(){}
~UnCopyable(){}
private:
UnCopyable(const UnCopyable& );
UnCopyable& operator=(const UnCopyable&);
};
class PersonalInfor:private UnCopyable//啓用私有繼承
{
public:
int show_ID(void )
{
std::cout<<personal_ID<<std::endl;
return NULL;
}
int set_id(const std::string& id)
{
personal_ID=id;
return NULL;
}
private:
std::string personal_ID;
};
int main(void)
{
PersonalInfor wang;
wang.set_id("1121212");
wang.show_ID();
PersonalInfor li = wang;
//PersonalInfor li(wang);//編譯期提示錯誤
system("pause");
}