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()
请按任意键继续. . .