构造函数语义学,一个类仅在下列四种情况下自动生成构造函数:
1> 如果一个类没有任何构造函数,但它的一个成员内部有默认构造函数,那么这个类也需要生成默认构造函数,不过这个操作仅在构造函数被调用时才会发生。
2> 当基类含有默认构造函数时,子类如果没有任何构造函数,则需合成默认构造函数。
3> 当类含有虚函数时,如果没有定义任何构造函数,则需合成默认构造函数。
4> 当类有虚继承时,如果没有定义任何构造函数,则需合成默认构造函数。
其实上面前两点是依赖于后两点的,为什么呢?看第一点和第二点,其都要求父类或者成员中包含默认构造,首先,认为声明的构造函数不叫默认构造;其次,既然存在默认构造,那么肯定是第三点或者第四点造成的。所以说第一点和第二点依赖于后两点。
所以说,下面这个类是没有构造函数的,包括默认构造函数:
class Product
{
public:
int m_IntVal;
};
那么要去通过一个指向Memberfunction的指针指向构造函数,肯定是失败的,所以编译器禁止指向构造函数的指针,并提示消息:
Error:a constructor or destructor may not have its address taken
进一步思考
首先,表驱动方法是必须掌握的一个技巧,使用它将带来程序效率上的提升,代码的整洁等等各个方面的好处。
其次,工程的管理必须进行相关方面标准的定义及控制,使用SourceMonitor等工具把握项目质量至关重要。这周员工培训上,听老韩这么多年经验的总结,让我深深认识了“没有银弹”这个深刻的道理,在“银弹”没有造出来的前提下,任何过程都必须严格控制,否则将陷入无穷无尽的“焦油坑”。
第三,继续给自己多挖几个坑吧,如果一直走平地,貌似永远也登不上高峰,因为同往高峰的路永远没有平路。
参考书目
《代码大全第二版》 Steve McConnell
《STL源码剖析》侯捷
《重构:改善既有代码的设计》Martin Fowler
《设计模式:可复用面向对象软件的基础》GoF四人帮
《大话设计模式》程杰
《深度探索C++对象模型》Stanley B.Lippman
《人月神话》Frederick P.Brooks.Jr.