不需要編譯器自己生成的函數,就應該明確拒絕

不需要編譯器自己生成的函數,就應該明確拒絕

在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");
}

 

發佈了30 篇原創文章 · 獲贊 7 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章