zoukankan      html  css  js  c++  java
  • 【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);
    }

    结果

    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);
    }

    错误提示

    /usr/include/c++/4.6/bits/ios_base.h:788:5: 错误: ‘std::ios_base::ios_base(const std::ios_base&)’是私有的
    
  • 相关阅读:
    多个文件目录下Makefile的写法
    通用多目录makefile的写法
    一个简单的通用Makefile实现
    Eclipse + CDT + YAGARTO + J-Link,STM32开源开发环境搭建与调试
    Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 上
    Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 下
    WiEngine+Eclipse+CDT+Sequoyah实现c++编程智能感知提示
    Docker 常用命令总结
    很好用的取代 PuTTY 的SSH远程登陆软件 Termius
    [转]如何优雅地进行参数校验?有什么提高代码稳壮性的方式?
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/3708157.html
Copyright © 2011-2022 走看看