动态网站制作指南
[  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ C/C++教程 ]的信息

本月文章推荐
.ListBox编程两例.
.C程序开发经典实例之4.
.一段指针的经典程序.
.C++中建立对象间消息连接的一种系.
.经典c程序100例==31--40.
.用C实现WebService.
.C++的iostream标准库介绍(1).
.浅谈C/C++内存泄漏及其检测工具.
.SQL SERVER与ACCESS,EXCEL的数据.
.C语言初学者入门讲座 第十四讲 枚.
.[收藏]ASP.Net生成静态HTML页 .
.C++编译器如何实现异常处理.
.C/C++ 跨平台I/O操作技巧.
.深入浅出Win32多线程程序设计之综.
.C++箴言:确保公开继承模拟“is-.
.给datagrid的按钮列添加css.
.C++箴言:理解Terminology术语.
.使用多线程实现数据实时采集.
.C++知识点.
.在VC++应用程序中实现颜色选择组.

C++箴言:拒绝不想用的编译器产生的函数

文章类别:C/C++教程 | 发表日期:2008-3-8 |


  假如你不想使用编译器为你产生的函数,就明确拒绝

  不动产代理商出售房屋,服务于这样的代理商的软件系统自然要有一个类来表示被出售的房屋:

class HomeForSale { ... };
  每一个不动产代理商都会很快指出,每一件财产都是独特的——没有两件是完全一样的。在这种情况下,为 HomeForSale 对象做一个拷贝的想法就令人不解了。你怎么能拷贝一个独一无二的东西呢?最好让这种类似企图拷贝 HomeForSale 对象的行为不能通过编译:

HomeForSale h1;
HomeForSale h2;
HomeForSale h3(h1); // attempt to copy h1 - should
// not compile!
h1 = h2; // attempt to copy h2 - should
// not compile!

  唉,防止这种编译的方法并非那么简单易懂。通常,假如你不希望一个 class 支持某种功能,你可以简单地不声明赋予它这种功能的函数。这个策略对于拷贝赋值运算符不起作用,因为,就象 Item 5 中指出的,假如你不声明它们,而有人又想调用它们,编译器就会隐式地声明它们。

  这就限制了你。假如你不声明拷贝构造函数和拷贝赋值运算符,编译器也可以为你生成它们。你的类还是会支持拷贝。另一方面,假如你声明了这些函数,你的类依然会支持拷贝。我们在这里的目标就是防止拷贝。 解决这个问题的要害是所有的编译器生成的函数都是 public。为了防止生成这些函数,你必须自己声明它们,但是你没有理由把它们声明为 public。相反,应该将拷贝构造函数和拷贝赋值运算符声明为 private。通过显式声明一个成员函数,可以防止编译器生成它自己的版本,而且将这个函数声明为 private,可以防止别人调用它。

  通常,这个方案并不十分保险,因为成员函数和友元函数还是能够调用 private 函数。换句话说,除非你不定义它们。那么,当有人不小心地调用了它们,在连接的时候会出现错误。这个窍门--定义一个 private 成员函数却故意不去实现它--确实不错,在 C++ 的 iostreams 库里,就有几个类用此方法防止拷贝。比如,看一下你用的标准库的实现中,ios_base,basic_ios 和 sentry 的定义,你就会看到拷贝构造函数和拷贝赋值运算符被声明为 private 而且没有定义的情况。

  将这个窍门用到 HomeForSale 上,很简单:

class HomeForSale {
 public:
  ..
 private:
  ...
  HomeForSale(const HomeForSale&); // declarations only
  HomeForSale& operator=(const HomeForSale&);
};
  你会注重到,我省略了函数参数的名字。这没有必要,只是一个普通的惯例。究竟,函数不会被定义,极少有机会被用到,有什么必要指定参数的名字呢?

  对于上面的类定义,编译器将阻止客户拷贝 HomeForSale 对象的企图,假如你不小心在成员函数或者友元函数中这样做了,连接程序会提出抗议。

  将连接时错误提前到编译时间也是可行的(早发现错误究竟比晚发现好),不要让 HomeForSale 自己去声明 private 的拷贝构造函数和拷贝赋值运算符,在一个特意设计的基类中声明。这个基类本身非常简单:

class Uncopyable {
 protected: // allow constrUCtion
  Uncopyable() {} // and destruction of
  ~Uncopyable() {} // derived objects...
 private:
  Uncopyable(const Uncopyable&); // ...but prevent copying
  Uncopyable& operator=(const Uncopyable&);
};
  为了禁止拷贝 HomeForSale 对象,我们必须让它从 Uncopyable 继续:

class HomeForSale: private Uncopyable { // class no longer
... // declares copy ctor or
}; // copy assign. operator
  在这里,假如有人——甚至是成员函数或友元函数——试图拷贝一个 HomeForSale 对象,编译器将试图生成一个拷贝构造函数和一个拷贝赋值运算符。就象 Item 12 解释的,这些函数的编译器生成版会试图调用基类的对应函数,而这些调用将被拒绝,因为在基类中,拷贝操作是 private 的。

  Uncopyable 的实现和使用包含一些微妙之处,比如,从 Uncopyable 继续不能是 public 的(参见 Item 32 和 39),而且 Uncopyable 的构造函数不必是 virtual 的(参见 Item 7)。因为 Uncopyable 不包含数据,所以它符合 Item 39 描述的空基类优化条件,但因为它是基类,此项技术的应用不能引入多重继续(参见 Item 40)。反过来说,多重继续有时会使空基类优化失效(还是参见 Item 39)。通常,你可以忽略这些微妙之处,而且此处只是用 Uncopyable 来做演示,因为它比较适合做广告。在 Boost(参见 Item 55)中你可以找到一个可用的版本。那个类名为 noncopyable。那是一个好的 class,我只是发现那个名字有一点儿不(un-)……嗯……非自然(nonnatural)。


  Things to Remember

  为了拒绝编译器自动提供的功能,将相应的函数声明为 private,而且不要给出实现。使用一个类似 Uncopyable 的基类是方法之一。



上一篇:深度探索C++对象模型(4) 人气:108
下一篇:C++ 类的静态成员(static) 人气:210
点击此处浏览全部C/C++的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-5-16 乘风多用户PHP统计系统 v3.4
2008-5-16 轩溪下载系统 v3.78 build 0515
2008-5-16 普沙B2B 浙江省商贸网 v2.0
2008-5-16 asp抓蜘蛛的小程序 v1.0
2008-5-16 齐齐乐网私服发布站 仿haosf新版
2008-5-16 IssTech信息反馈系统 v1.0
2008-5-16 自由领域大头贴(js接口版) 修正版
2008-5-16 医院网站系统
2008-5-16 智拓-分类信息管理系统 v5.0
2008-5-7 Windows XP SP3 官方英文版
2008-5-7 Windows XP SP3 官方香港中文版
2008-5-7 Windows XP SP3 官方繁体中文版
2008-5-7 Windows XP SP3 官方简体中文版
2008-4-30 Multiple Unzip Wizard 1.02
2008-4-30 Multiple Unrar Wizard 1.0.0
2008-4-30 WinZip Install/Try/Uninstall a
2008-4-30 ZIP压缩文件修复器WzipFix 2.0
2008-4-30 Pentazip 6.01 Build 189 For Wi
  发表评论
姓 名: 验证码: [ 全部贴吧 ] [ 浏览评论 ]
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号