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

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&)’是私有的

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

  1. Effective C++ 条款六 若不想使用编译器自动生成的函数,就该明确拒绝

    class HomeForSale //防止别人拷贝方法一:将相应的成员函数声明为private并且不予实现 { public: private: HomeForSale(const HomeForS ...

  2. Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝

    为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ...

  3. 读书笔记 effective c++ Item 6 如果你不想使用编译器自动生成的函数,你需要明确拒绝

    问题描述-阻止对象的拷贝 现实生活中的房产中介卖房子,一个服务于这个中介的软件系统很自然的会有一个表示要被销售的房屋的类: class HomeForSale { ... }; 每个房产中介会立刻指出 ...

  4. Effective C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就 ...

  5. Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝

    Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ...

  6. Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝

    一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const strin ...

  7. Effective C++ 条款06:若不想使用编译器自动生成的函数,就该明确拒绝

    规则一 将成员函数声明为private而且故意不实现他们 class HomeForSale { public: ... private: ... HomeForSale(const HomeForS ...

  8. 条款6:若不想使用编译器自动生成的函数,就该明确拒绝(Explicity disallow the use of compiler-generated functions you do not want)

    class uncopyable{ protected: uncopyable(){};                                                         ...

  9. [EffectiveC++]item06:若不想使用编译器自动生成的函数,就该明确决绝

随机推荐

  1. Django Form的学习

    django.forms 是Django处理form的库      本质上可以直接通过对HttpRequest达到同样的效果,但是django.from带来更便捷的处理方式.功能有几点 通过form类 ...

  2. 微软更换考试中心后报名攻略以及MCT半价

    微软从Prometric更换为Pearson的考试中心,比起以前的预约流程更加便捷. Pearson VUE为微软公司提供MCP考试服务 Pearson VUE为微软公司提供MCP考试服务 http: ...

  3. spring中Bean的注入类型

    1.属性注入    即通过setXxx()方法注入Bean的属性值或依赖对象,由于属性注入方式具有可选择性和灵活性高的优点,因此属性注入是实际应用中最常采用的注入方式.    属性注入要求Bean提供 ...

  4. NOIP2015 心得

    NOIP2015的复赛已经过去一个多星期了,成绩也已经出来了,作为一个大(ruo)山(sheng)东的蒟蒻,在学了一年之后拿到了255的成绩.这个成绩并不是很好,但也算在我的预料之内. 第一天第一题水 ...

  5. ubuntu 14.04 安装 Quartus II 13.1 过程

    神奇的linux! 第一步去官网注册然后下载对应的linux版本,包括软件和设备文件两部分,软件也就是quartus II nios ide,modelsim-altera这些,设备就是具体alter ...

  6. NET免费服务器

    NET免费服务器 1.先注册一个号.地址:https://appharbor.com/ 2.看看有没有你需要的插件,基本上都是免费的 3.本地创建git库 4.复制git远程仓库的地址 5.推送到远程 ...

  7. C# Windows - 创建控件

    VS提供了一个项目类型Windows Control Library,使用它可以创建自己的控件. 可以开发两种不同类型的自定义控件: 用户或组合控件:这种控件是根据现有控件的功能创建一个新控件.这类控 ...

  8. eclipse下如何关联android-support-v4.jar源码

    一.首先导入jar包 如果android-support-v4.jar包在libs目录下,先将它移除.然后点选中项目右键 --->properties-->javabuildpath--& ...

  9. HttpWebRequest,HttpWebResponse的用法和用途

    1.用途:HettpWebRequest,HettpWebResponse用途和webServers的作用差不多,都是得到一个页面传过来的值.HttpWebRequest 2.用法:--------- ...

  10. android 自定义ratingbar 图片显示不全的解决方案

    在res/style中自定义评分条: <!-- 自定义评分条 --> <style name="roomRatingBar" parent="@andr ...