码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-05-10 01:15:46      阅读:356      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   color   

bubuko.com,布布扣

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

bubuko.com,布布扣
class HomeFoeSale { ......}
bubuko.com,布布扣

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

bubuko.com,布布扣
HomeForSale h;
HomeForSale h1(h);      //调用复制构造函数
HomeForSale h2 = h;     //调用赋值操作符
bubuko.com,布布扣

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

bubuko.com,布布扣
#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);
}
bubuko.com,布布扣

结果

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

 

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

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

可以利用继承来解决例如

bubuko.com,布布扣
#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;
}
bubuko.com,布布扣

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

 

反思

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

bubuko.com,布布扣
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;


int main()
{
    ifstream i;
    ifstream i2(i);
}
bubuko.com,布布扣

错误提示

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

 

 

 

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

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

标签:style   blog   class   code   java   color   

原文地址:http://www.cnblogs.com/kaituorensheng/p/3708157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!