使用Boost對非值語義的C++類實現noncopyable

CalmReason發表於2016-04-01

C++中的類根據用途可以分為如下三類:

1 值語義(資料抽象ADT):可以拷貝,拷貝之後和原來的物件沒關係。

(1)如基礎型別int等,容器型別vector,list,set等。Date型別、Timestamp型別。

(2)封裝一些資料成員,並提供操作的介面。

(3)支援資料聚合

(4)支援函式過載、操作符過載

(5)效率無損

(6)模板與泛型

(7)是C++程式設計正規化的重要一種

(8)生命週期和int一樣無需管理

2 物件語義:不應該被拷貝noncopyable

2.1 基於物件(object-based):封裝

2.2 物件導向(object-oriented):封裝、訊息傳遞。對應著資源(檔案、員工、印表機、賬號、套接字)

(1)生命期要管理

(2)引用語義

(3)智慧指標參與

(4)noncopyable

綜上所述,我們在開發的時候應該對所有的非值語義的類設定noncopyable

參考:《Linux多執行緒服務端程式設計》陳碩著

程式碼:

#include "boost/noncopyable.hpp"
#include <vector>
#include <iostream>

class Company : public boost::noncopyable
{
public:
	Company(){}
	~Company(){}
	void print(void){std::cout<<"company::print()"<<std::endl;}
};


int main(int, char *[])
{
	Company a;
	a.print();
	//Company b(a);//編譯錯誤
	//Company b=a;//編譯錯誤
	Company b;
	b.print();
	//b=a;//編譯錯誤
	std::vector<Company> vc;//OK
	//vc.push_back(a);//編譯錯誤
	return 0;
};
輸出:
company::print()
company::print()
請按任意鍵繼續. . .



相關文章