了解编译器的行为
来源:互联网 发布:女装淘宝店铺特别名字 编辑:程序博客网 时间:2024/04/19 14:39
了解编译器的行为
当我们创建一个类时,编译器会为我们做什么!很多时候,由于不了解编译器的行为,我们的程序中总会有很多隐晦的问题,而这些问题往往不会有任何的编译或者连接期错误。
对于一个类,编译器可能会为我们定义的函数有:默认构造函数,拷贝构造函数,赋值操作符和析构函数。
因此,如果我们建立一个类:
class Empty{};
就等同于我们建立了一个类
class Empty
{
Public:
Empty(){}
~Empty(){}
Empty(const Empty&);
Empty& operator=(const Empty&);
};
但是,如果我们自己建立了一个其中任何一个的话,那么编译器就不会再为我们创建了。
在有些程序中,我们可能不想实现拷贝和赋值操作,这个时候我们又不能直接不定义,因为不定义的话,那么编译器就会自动为我们创建一个。解决的方案就是将拷贝构造函数和赋值操作符定义在private内,这样一旦客户程序员调用拷贝或者赋值,编译器就会提示一个错误。但这样仍不够严密,因为成员函数和声明为friend的函数仍然可以调用他们,我们可以进一步解决这个问题,那就是只使用函数的声明而不加以定义,这个时候如果成员函数或者friend函数想调用的话,链接器就会发生一个错误。
当然,如果我们可以将链接期错误提至编译器更好,因为编译器错误要远比链接期错误容易解决。因此,我们可以定义这么一个类
class Noncopy
{
protected:
Noncopy(){}
~Noncopy(){}
private:
Noncopy(const Noncopy&);
Noncopy& operator=(const Noncopy&);
};
这样,我们通过继承这个类,每一次子类想要建立拷贝或者赋值操作符时,编译器就会拒绝这类请求,并在编译期提出错误。
但遗憾的是,这种解决方案导致的多重继承问题,可能会为我们的程序带来更大的麻烦。
总而言之,为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现。
- 了解编译器的行为
- 诡异的编译器行为
- 了解Android的编译器
- 了解new-handler的行为
- 了解new_handler的行为 set_new_handler
- assert 断言的不同编译器行为
- Java编译器的行为------第一节:方法
- 条款49:了解new-handler的行为
- 条款49:了解new handler的行为
- 条款49:了解new-handler的行为
- 条款49:了解new-handler的行为
- 条款49 了解new-handler的行为
- 深入了解VC++编译器的使用
- 深入了解VC++编译器的使用
- 深入了解VC++编译器的使用
- 《Effective C++》读书笔记之item49:了解new-handler的行为
- effective C++ 条款 49:了解new-handler的行为
- 了解买家的购买行为,才能做好卖家
- java 基础02
- Ubuntu 11.10下Optimus技术实现Nvidia双显卡切换
- android109--FLAG_ACTIVITY_NEW_TASK
- .Net ajax检测用户名是否重复
- C++ ratio
- 了解编译器的行为
- VC程序设计中可序列化类的实现
- 求二进制数中1的个数
- android110--优化、listView
- 2011CCTV中国经济年度人物评选结果揭晓
- 第六周—工资类
- PL/SQL的应用操作实例以及解析
- WIFI编程
- 初识EJB3.0的答疑总结(一)