Effective C++学习笔记(四)

设计与声明

条款十八 让接口容易被正确使用,不易被误用

  • 好的接口很容易被正确使用,不容易被误用。

  • 促进正确使用:接口的一致性,内置类型的行为兼容。

  • 阻止误用:建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任

  • 提到了shared_ptr。没仔细看。

条款十九 设计class,犹如设计type

条款二十 传递const引用,而不是value

  • 尽量用const引用替换传值,value涉及到构造析构对象,要消耗更多,const引用,没有创建任何对象,所以消耗没那么多
class Person
{
public:
    Person(int a = 0) : m_a(a)
    {
    }
    virtual ~Person()
    {
        cout << "Calling Person destructor" << endl;
    }
public:
    int m_a;
};
class Student:public Person
{
public:
    Student() {}
    ~Student() {

        cout << "Calling Student destructor" << endl;
    }

private:

};
//如果是(Student stu),则需要构造两次,析构两次。
bool isStudent(const Student& stu)//只需要构造一次,析构一次
{
    return true;
}

//***************************************************************
int main( )
{
    Student stu;
    cout << isStudent(stu) << endl;

    return 0;
}
  • 在底层中,引用其实是用指针来完成的。但是并非都是如此,如果参数是内置的类型或者STL的迭代器或者函数对象,比如int,那么直接传值并不会造成过多的构造和虚构。

条款二十一 必须返回对象时,别妄想返回其reference

  • 绝不要返回pointer或reference指向一个local stack对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个localstatic对象而有可能同时需要多个这样的对象。

条款二十二 将 成员变量声明为private

  • 切记将成员变量生命为private。使得客户访问数据具有一致性,可细微划分访问控制,并提供class作者以充分的实现弹性。

  • protected并不比public更具有封装性。

条款二十三 用non-member、non-friend替换member函数

  • 这样做可以增加封装性,报过弹性和技能扩充性

条款二十四 若所有参数皆需类型转换,请为此采用non-member函数

条款二十五 考虑写出一个不抛异常的swap函数

  • 当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛异常

  • 调用swap时应针对std::swap使用using声明,然后调用swap,并且不带任何命名空间资格修饰

posted on 2019-05-15 15:25  陶大先生  阅读(243)  评论(0编辑  收藏  举报

导航