• 【06】若不想使用编译器自动生成的函数,就该明确拒绝


    1、有些情况下,我们不希望对象被拷贝,比如独一无二的对象,拷贝是没有意义的。这种情况下,我们应该禁止拷贝。也就是不提供copy构造和copy赋值,可问题是,如果我们不提供,编译器会自动生成。那该怎么办?

    2、我们声明copy构造和copy赋值为private,这就明确告诉了编译器,我已经声明了,你别为我生成了。由于copy构造和copy赋值是private,就禁止了外部的拷贝操作。

      但仔细想,还是有问题,因为类的成员方法,友元方法,友元类还是可以访问private权限的copy构造和copy赋值,那该怎么办?

      只声明,不定义。这样,就导致编译器连接的时候出错。有没有更好的办法呢?也就是说,将连接时错误移到编译时错误,在编译时就报错。毕竟,越早发现错误就越好。

      编译器自动生成的方法,只有在需要的时候才自动生成,也就是被调用的时候,才自动生成。另外,编译器自动生成的方法,还有一个特点,为了保证父类的成分被初始化和赋值,自动生成的copy构造和copy赋值,会调用父类的对应方法。如果我将父类的copy构造和copy赋值声明为private,编译器为子类自动生成的copy构造和copy赋值,没法调用父类对应的方法,编译出错。

      在需要的时候,编译器才自动生成。如果代码中,没有copy构造和copy赋值,编译器不会试图去生成copy构造和copy赋值,就没问题了。

    3、为了让copy构造和copy赋值在编译时报错,需要一个父类。boost库中,提供了一个类noncopyable,继承它就可以了。

  • 相关阅读:
    Json对象与Json字符串互转(4种转换方式)
    Web.config配置文件详解
    jQuery BlockUI Plugin Demo 6(Options)
    jQuery BlockUI Plugin Demo 5(Simple Modal Dialog Example)
    jQuery BlockUI Plugin Demo 4(Element Blocking Examples)
    jQuery BlockUI Plugin Demo 3(Page Blocking Examples)
    jQuery BlockUI Plugin Demo 2
    <configSections> 位置引起的错误
    关于jQuery的cookies插件2.2.0版设置过期时间的说明
    jQuery插件—获取URL参数
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3521447.html
Copyright © 2020-2023  润新知