设计与声明
条款十八 让接口容易被正确使用,不易被误用
-
好的接口很容易被正确使用,不容易被误用。
-
促进正确使用:接口的一致性,内置类型的行为兼容。
-
阻止误用:建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任
-
提到了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,并且不带任何命名空间资格修饰