2014年4月2日
摘要: 1、要求对象只能产生于heap之中,该怎么办? 栈上的对象肯定调用构造方法和析构方法(离开作用域的时候),因此,要求对象只能产生于heap之中,也就是禁止栈上产生对象,解决办法有两种:将所有的构造方法声明为private,或者将析构方法声明为private。2、将所有的构造方法声明为private,这样就不能在栈上构造对象了。这有两点需要注意: a、这种情况下,不能在外部使用new operator在堆上构造对象,因为new operator要在分配的内存上,调用构造方法构造对象。因此,需要重新暴露接口,返回堆上的对象。办法有:在类内部使用new operator,暴露static方法;使.. 阅读全文
posted @ 2014-04-02 20:17 Andy Niu 阅读(682) 评论(0) 推荐(0) 编辑
摘要: 1、C++中的delete operator做了两件事:调用析构方法和调用operator delete释放内存。2、考虑析构方法,如果析构方法是虚方法,调用指针真实类型的析构方法,否则调用表面类型的析构方法。3、析构方法的调用分为两个步骤: a、调用子类的析构方法(释放子类动态获取的资源),调用子类的合成析构方法(逆序调用字段的析构方法,如果是类类型,递归调用析构方法,如果是内置类型,不需要做什么),析构子类专有的成分。 b、子类析构方法完成,调用父类的析构方法(释放父类动态获取的资源),调用父类的合成析构方法(逆序调用字段的析构方法,如果是类类型,递归调用析构方法,如果是内置类型,不需.. 阅读全文
posted @ 2014-04-02 18:55 Andy Niu 阅读(1817) 评论(0) 推荐(0) 编辑
摘要: 1、考虑下面的需求,软件处理动物,Cat与Dog需要特殊处理,因此,设计Cat和Dog继承Animal。Animal有copy赋值(不是虚方法),Cat和Dog也有copy赋值。考虑下面的情况: Cat cat1; Cat cat2; Animal *a1 = &cat1; Animal *a2 = &cat2; *a1 = *a2; 思考*a1 = *a2会有什么问题? copy赋值不是虚方法,根据表面类型,调用Animal的copy赋值,这就导致所谓的部分赋值,cat2的Animal成分赋值给cat1的Animal成分,二者的Cat成分保持不变。2、怎么解决上面的问题? 将 阅读全文
posted @ 2014-04-02 11:53 Andy Niu 阅读(295) 评论(0) 推荐(0) 编辑