【Effective c++】条款6:若不想使用编译器自动生成的函数就应该明确拒绝-阿里云开发者社区

开发者社区> 技术mix呢> 正文

【Effective c++】条款6:若不想使用编译器自动生成的函数就应该明确拒绝

简介:
+关注继续查看

地产中介卖的是房子,其使用的中介软件系统应该有个类用来描述卖掉的房子

class HomeFoeSale { ......}

但是任何房子都是独一无二的,不应该存在两个房子拥有同样的属性,因此以下操作不应该正确!

HomeForSale h;
HomeForSale h1(h);      //调用复制构造函数
HomeForSale h2 = h;     //调用赋值操作符

阻止这两个操作(复制、赋值)可以不声明它们,but自己不声明,编译器会自动生成,并且访问权限还是public。没办法只好声明出来,但是如何组织这两个操作呢,好吧,把他们的访问权限声明为private,因为阻止这两个操作,因此只声明,不定义。例如:

复制代码
#include <iostream>
#include <vector>
using namespace std;

class base 
{
    public:
        base() {};
    private:
        base(const base&);
        base& operator=(const base&);
};


int main()
{
    base b;
    base b1(b);
}
复制代码

结果

1
2
3
del5.cc: 在函数‘int main()’中:
del5.cc:10:3: 错误: ‘base::base(const base&)’是私有的
del5.cc:18:11: 错误: 在此上下文中

 

但是问题又来了:如果类中的成员函数或类的友元函数访问咋整,例如:

复制代码
#include <iostream>
#include <vector>
using namespace std;

class base 
{
    public:
        base() {};
        void hello() { base b; base m(b); base n = b; } 
    private:
        base(const base&);
        base& operator=(const base&);
};


int main()
{
    base b;
}
复制代码

可以利用继承来解决例如

复制代码
#include <iostream>
#include <vector>
using namespace std;

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

class HomeForSale : public base
{
    public:
        HomeForSale() : base() {}
};

int main()
{
    HomeForSale d;
}
复制代码

这样,HoemForSale的朋友或成员函数也无力回天了(毕竟父类的函数是private的).

 

反思

c++ 中的流对象就是采用这样的原理.

复制代码
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;


int main()
{
    ifstream i;
    ifstream i2(i);
}
复制代码

错误提示

1
/usr/include/c++/4.6/bits/ios_base.h:788:5: 错误: ‘std::ios_base::ios_base(const std::ios_base&)’是私有的

 

 





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3708157.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
asp.net core webapi 使用ef 对mysql进行增删改查,并生成Docker镜像构建容器运行
1.构建运行mysql容器,添加数据库user 参考Docker创建运行多个mysql容器,地址 http://www.cnblogs.com/heyangyi/p/9288402.html 添加user数据库,添加tbusers表 2.
2454 0
如何让接口文档自动生成,SpringBoot中Swagger的使用
在开发过程中,java后端需要与客户端进行交互,需要将后端的接口及参数写成文档给调用者查阅。一个问题也有此而生,需求改动频繁,接口设计也会随之改动,文档修改的不及时会带来很大的问题。 Swagger是一个自动生成文档的工具,可以在线查阅文档,减少了开发人员的负担,下面我们就来看看如何在SpringBoot中使用Swagger。
941 0
成为一个编译器之「使用 JavaScript 来制作编译器」
本文讲的是成为一个编译器之「使用 JavaScript 来制作编译器」,布希维克,布鲁克林,一个很棒的周日。我在书店里发现了一本书 John Maeda 写的 “Design by Numbers” 。
1111 0
Hive内置运算函数,自定义函数(UDF)和Transform
4.Hive函数 4.1 内置运算符 内容较多,见《Hive官方文档》   4.2 内置函数 内容较多,见《Hive官方文档》 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF   测试各种内置函数的快捷方法: 1、创建一个dual表 create table dual(id string); 2、loa
4650 0
xcode反汇编调试iOS模拟器程序(三)查看Objective-C函数与参数
在Objective-C函数的入口处(第一行)加断点,可用esp指针来探查参数。 以esp为基址,往后的偏移分别是: 0:函数执行完毕后的返回地址(不是返回值的地址哦) 4:对象实例的指针,即self指针 8:selector,实际是一个...
973 0
使用mybatis-generator-plugin自动生成代码整合SpringBoot+MyBatis
使用mybatis-generator-plugin自动生成代码整合SpringBoot+MyBatis
8 0
+关注
2968
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载