不可复制类的原理和实现

主要原理在三、四两条

一.拷贝构造函数与赋值操作符
class A;

A a;

A b1(a);    //拷贝构造函数的实例

A b2 = a;  //赋值操作符的实例:

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

A a;

A b(a);

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

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

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

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

四.如上所述,为了防止复制和赋值,类可以显示声明其拷贝构造函数和赋值操作符为private,如果拷贝构造函数是私有的,将不允许用户代码复制该类类型的对象,编译器将拒绝任何进行复制的尝试。此时,类的友元和成员仍可以复制,当然要想禁止这种情况,也很容易实现。下面是不可复制类的代码:

class NonCopyable
{
    protected:
            NonCopyable(){}
            ~NonCopyable(){}
    private:
        NonCopyable(const NonCopyable &);
        const NonCopyable& operator=(const NonCopyable&);
};

不可复制类的原理和实现,布布扣,bubuko.com

时间: 2024-10-07 06:32:18

不可复制类的原理和实现的相关文章

Java中的静态代理、通用动态代理类以及原理剖析

代理模式和静态代理 在开发中,代理模式是常用的模式之一,一般来说我们使用的代理模式基本上都是静态代理,实现模式大致如下 : 我们以网络代理为例,简单演示一下静态代理的实现 : // 网络接口 interface Network { public void surfTheInternet(); public void gotoFacebook(); } // 普通网络 class CommonNetwork implements Network { @Override public void su

【转载】Lua中实现类的原理

原文地址 http://wuzhiwei.net/lua_make_class/ 不错,将metatable讲的很透彻,我终于懂了. ------------------------------------------------------------ Lua中没有类的概念,但我们可以利用Lua本身的语言特性来实现类. 下文将详细的解释在Lua中实现类的原理,涉及到的细节点将拆分出来讲,相信对Lua中实现类的理解有困难的同学将会释疑. 类是什么? 想要实现类,就要知道类到底是什么. 在我看来,

PHP实现Collection数据集类及其原理

PHP 语言最重要的特性之一便是数组了(特别是关联数组).PHP 为此也提供不少的函数和类接口方便于数组操作,但没有一个集大成的类专门用来操作数组. 如果数组操作不多的话,个别函数用起来会比较灵活,开销也小.但是,如果经常操作数组,尤其是对数组进行各种操作如排序.入栈.出队列.翻转.迭代等,系统函数用起来可能就没有那么优雅了. 下面已实现的一个 Collection 类(数据集对象),来自 ThinkPHP5.0 的基础类 Collection,就是一个集大成的类. 1. Collection源

关于boost中enable_shared_from_this类的原理分析

首先要说明的一个问题是:如何安全地将this指针返回给调用者.一般来说,我们不能直接将this指针返回.想象这样的情况,该函数将this指针返回到外部某个变量保存,然后这个对象自身已经析构了,但外部变量并不知道,此时如果外部变量使用这个指针,就会使得程序崩溃. 使用智能指针shared_ptr看起来是个不错的解决方法.但问题是如何去使用它呢?我们来看如下代码: #include <iostream> #include <boost/shared_ptr.hpp> class Tes

JUC中的原子操作类及其原理

昨天简单的看了看Unsafe的使用,今天我们看看JUC中的原子类是怎么使用Unsafe的,以及分析一下其中的原理! 一.简单使用AtomicLong 还记的上一篇博客中我们使用了volatile关键字修饰了一个int类型的变量,然后两个线程,分别对这个变量进行10000次+1操作,最后结果不是20000,现在我们改成AtomicLong之后,你会发现结果始终都是20000了!有兴趣的可以试试,代码如下 package com.example.demo.study; import java.uti

JVM加载类的原理机制

在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载.链接和初始化,其中链接又可以分成校验.准备.解析装载:查找和导入类或接口的二进制数据: 链接:执行下面的校验.准备和解析步骤,其中解析步骤是可以选择的: 校验:检查导入类或接口的二进制数据的正确性: 准备:给类的静态变量分配并初始化存储空间: 解析:将符号引用转成直接引用:初始化:激活类的静态变量,初始化Java代码和静态Java代码块

7.Java集合-Arrays类实现原理及源码分析

Java集合---Arrays类源码解析 转自:http://www.cnblogs.com/ITtangtang/p/3948765.html 一.Arrays.sort()数组排序 Java Arrays中提供了对所有类型的排序.其中主要分为Primitive(8种基本类型)和Object两大类. 基本类型:采用调优的快速排序: 对象类型:采用改进的归并排序. 1.对于基本类型源码分析如下(以int[]为例): Java对Primitive(int,float等原型数据)数组采用快速排序,对

C++ 句柄类的原理以及设计

句柄类存在的意义是为了弥补将派生类对象赋给基类对象时发生的切片效应.比如以下的程序: multimap<Base> basket; Base base; Derived derive; basket.insert(base); //ok,add copy of base; basket.insert(derive); //ok,but derive sliced down to its base part. 也就是说在把派生类的对象赋值给基类的时候,会发生切片效益,派生类的非基类部分会被切掉,

Spring核心类和原理分析

spring 的骨架 spring 的骨架,也是spring 的核心包.主要包含三个内容 1.context:spring 的上线文-------导演 2.core:spring的核心包,主要包括spring所以用到的工具-------道具 3.beans:spring的bean实例 -------演员 导演负责安排演出,演员负责按照导演的指示来演出,演出过程中需要使用道具. 我想大家看完这些图片之后就明白大致的包关系了. spring包结构 大家看到相应包内容. core包侧重于帮助类,操作工