LinuxC/C++编程基础(19) 不可复制类的原理及实现

本文详细介绍了如何在C++和Linux环境中创建不可复制的类,通过实例解析了拷贝构造函数和赋值操作符的作用,以及如何通过声明它们为private来阻止对象复制。此外,还提到了boost::noncopyable类作为不可复制类的一个例子,并给出了一个具体的编程实例。

有些类需要完全禁止复制。比如,iostream类,scoped_ptr类就不允许复制,本文叙述关于这种类型的类的原理及实现,如下:

一.拷贝构造函数的实例,如下:
class A;

A a;

A b(a);
二.重载赋值操作符的实例:
class A;

A a;

A b = a;

三.拷贝构造函数的应用实例
1.同一类型的对象显示或隐式初始化一个对象,如下:
eg:
class A;

A a;

A b(a);

2.作为函数的实参,如下:
eg:
void work(const A& a);
3.作为函数的返回值

eg:
A& getA() const
{

return a;
}
4.初始化顺序容器的元素
5.根据元素初始化式列表初始化数组元素


转载请注明出处:山水间博客,http://blog.youkuaiyun.com/linyanwen99/article/details/8264317

四.合成的拷贝构造函数和合成的赋值操作符,如下:

如果用户没有显示的定义复制构造函数或赋值操作符,编译器将会默认的合成一个复制构造函数。复制构造函数与合成复制构造函数,或者赋值操作符与合成赋值操作符不同,编译器默认合成的函数的行为是"逐个成员初始化",将新对象初始化为原对象的副本。逐个成员初始化不包括static成员,只负责初始化非static成员。

五.如上所述,为了防止复制和赋值,类可以显示声明其拷贝构造函数和赋值操作符为private

,如果拷贝构造函数是私有的,将不允许用户代码复制该类类型的对象,编译器将拒绝任何进行复制的尝试。此时,类的友元和成员仍可以复制,要想禁止这种情况,也很容易实现,这里略过.比如,boost::noncopyable类就是不可复制类,其声明如下:

六.编程实例,如下:

转载请注明出处:山水间博客,http://blog.youkuaiyun.com/linyanwen99/article/details/8264317

1.noncopyable-test.h头文件的声明,如下:

#ifndef NONCOPYABLE_TEST_H
#define NONCOPYABLE_TEST_H
#include <boost/scoped_ptr.hpp>
class NoCopy{
private:
    struct impl;//基于pimpl实现
    boost::scoped_ptr<impl> pimpl;//使用了scoped_ptr,使得该类是线程安全的
public:
    NoCopy();
    ~NoCopy();
public:
    void work();
};
#endif

2.noncopyable-test.cpp的实现,如下:

#include "noncopyable-test.h"
#include <string>
#include <iostream>
struct NoCopy::impl{
    void work(){
        std::cout<<str<<std::endl;
    }
    std::string str;
};
NoCopy::NoCopy():pimpl(new impl){
    pimpl->str = "hello world";
}
NoCopy::~NoCopy(){
    std::cout<<"~NoCopy()"<<std::endl;
}
void NoCopy::work(){
    pimpl->work();
}

3.main.cpp的实现,如下:

#include "noncopyable-test.h"
int main(int argc,char** argv){
    NoCopy nc;
    NoCopy nc1(nc);
    nc.work();
    nc1.work();
    return 0;
}

七,运行结果,如下:



转载请注明出处:山水间博客,http://blog.youkuaiyun.com/linyanwen99/article/details/8264317

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值