`
ijavagos
  • 浏览: 1250108 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

设计class犹如设计type——effective C++学习笔记

阅读更多

<!--[endif]-->设计class犹如设计typeTreat class design as type design.

设计class要带着和“语言设计者当初设计语言内置类型时”一样的谨慎来设计class

class也是一个types,好的types具备自然的语法,直观的语义,以及一或多个高效实现品。

class设计checklist

<!--[if !supportLists]-->1、 <!--[endif]-->type的对象应该如何创建和销毁?

<!--[if !supportLists]-->2、 <!--[endif]-->对象的初始化和对象的赋值该有什么样的差别?这决定了class的构造函数和赋值(assignment)操作符的行为,以及其间的差别,很重要的是不要混淆了初始化和赋值。

<!--[if !supportLists]-->3、 <!--[endif]-->type的对象如果被passed by value(以值传递),意味着什么?copy的构造函数定义了一个typepass-by-value该如何实现。

<!--[if !supportLists]-->4、 <!--[endif]-->什么是新type的合法值?class的成员变量而言,通常只有某些数值集是有效的。那些数值集决定了你的class必须维护的约束条件,也就觉得了你的成员函数(特别是构造函数,赋值操作符以及所谓的seter函数)必须进行的错误检查。

<!--[if !supportLists]-->5、 <!--[endif]-->你的新的type需要配合某个继承体系吗?如果你继承自某些既有的class,你就受到那些class的设计的束缚,特别是他们的函数是virtualno-virtual的影响。如果允许其他的classes继承你的class,那么你所声明的函数——尤其是析构函数——是否为virtual

<!--[if !supportLists]-->6、 <!--[endif]-->你的新type需要什么样的转换?如果你希望类型T1之物被隐式转换为T2之物,就必须在T1内些一个类型转换函数operator T2或在T2内部写一个non-explicit-one-argument(可被单一实参调用)的构造函数。如果你只允许explicit构造函数存在,就得写出专门负责转换的函数,且不得为类型转换操作符(type conversion operator)或non-explicit-one-argument构造函数。尽量避免隐式转换。

<!--[if !supportLists]-->7、 <!--[endif]-->什么样的操作符和函数对此新的type而言是合理的?

<!--[if !supportLists]-->8、 <!--[endif]-->什么样的标准函数应该被驳回?那些正是你声明为private的函数,比如,构造函数可能会声明为private,也就是不允许进行new操作。

<!--[if !supportLists]-->9、 <!--[endif]-->谁该取用type的成员?这可以决定哪些成员是public,那些成员是protected,那些为private,也可以决定哪些classesfunctionfriends

<!--[if !supportLists]-->10、 <!--[endif]-->声明式新type的未声明接口?

<!--[if !supportLists]-->11、 <!--[endif]-->你的新type有多么的一般化?或许你其实并不是定义一个新type,而是定义一整个types家族。果真如此你就不应该定义一个新的class,而应该定义一个新的class template

<!--[if !supportLists]-->12、 <!--[endif]-->你真的需要一个新的type吗?如果只是定义新的derived class以便为既有的class添加新机能,那么说不定单纯定义一个或多个non-members函数或template更能达到目的。

分享到:
评论

相关推荐

    Effective C++学习笔记

    19. **设计class犹如设计type**:考虑类作为抽象数据类型,关注其封装性和抽象性,避免暴露内部细节。 20. **宁以pass-by-reference-to-const替换pass-by-value**:传递大对象或不可变对象时,传引用更高效,且不会...

    effective C++ (3rd) 学习笔记

    通过这些学习笔记,我们可以了解到《Effective C++》不仅为我们提供了C++编程中的一些基本和高级技巧,也教会我们如何遵循最佳实践,编写出更加高效、健壮的C++代码。学习这些知识点,对于提高C++编程能力和解决实际...

    c++学习的50条黄金定律

    ### C++学习的50条黄金定律解析 #### 1. C++学习初期与C语言的关系 - **解析**:C++是基于C语言发展而来的,因此掌握C语言的基础对于学习C++非常有帮助。这并不意味着必须精通C语言才能学好C++,而是说C语言的一些...

    前辈的c++50个建议

    根据给定的信息,“前辈的C++50个建议”提供了关于如何有效学习和掌握C++语言的指导思想和实用建议。下面将详细解释这些建议,并深入探讨它们背后的原理和重要性。 ### 1. C++的学习应当从C语言入手 C++是一种基于...

    学习c++的50条忠告(初学者必看)

    - 《Effective C++》、《More Effective C++》和《Exceptional C++》是C++学习者不可错过的书籍。 - **建议**:深入研读这些书籍,掌握C++的高级用法。 #### 24. 学习路线图 - 学习C++需要一个清晰的学习路线图。 -...

    给C++初学者的忠告

    - **解释**:这本书是C++学习的经典教材之一,能够帮助读者建立面向对象的思维方式,深入理解C++的核心概念。 - **建议**:利用这本书来系统地学习C++的基础知识,并通过书中提供的大量实例来练习和巩固所学内容。 ...

Global site tag (gtag.js) - Google Analytics