Effective C++ 4.设计与声明

//条款18:让接口容易被正确使用,不易被误用
//	1.如果客户企图使用某个接口而却没有获得他所预期的行为,那么这个代码就不该通过编译。
//	2.促进正确使用的方法包括接口的一致性,以及与内置类型的行为兼容。
//	3.阻止误用的方法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。
//	4.shared_ptr支持自定义删除器,可以方便的用于管理各种资源。

//条款20:pass by reference to const 替换 pass by value
//	1.C++的底层操作会将传引用操作以指针的形式来实现。
//	2.传递const的引用可以避免子对象传递父对象时候面临的被切割问题。
//	3.传递const的引用可以有效避免无谓的拷贝和销毁操作,在性能上产生优势
//	4.对于内置类型以及STL的迭代器以及STL中的函数对象,对它们而言传递值比传递引用更加适当。对于此条规则,经vs2010测试发现,传值与传引用几乎没什么差别,所以统一使用传引用代替传值是可以的。

//条款22:将成员变量声明为private
//	1.将成员变量声明为private的,这可以赋予客户访问数据的一致性、可细微划分访问控制、允诺约束条件获得保证,并让类的设计者以充分的实现弹性。
//	2.切记protected并不比public更具封装性。

//条款23:以非成员函数、非友元函数替换成员函数
//	1.越少的代码可以访问到类的私有成员数据,那么类的私有成员数据的封装性就越好。
//	如下代码:ClearCTestData()函数被声明为类的非成员函数,使得能访问类的私有成员的函数减少,这就提高了类的数据的封装性。如此当改变了类的数据成员的时候,需要被改变的代码量就会减少。
class CTest
{
public:
	CTest() : value0(0), value1(0){}

public:
	void ClearValue0(){value0 = 0;}
	void ClearValue1(){value1 = 0;}

private:
	int value0;
	int value1;
};

void ClearCTestData(CTest &Test)
{
	Test.ClearValue0();
	Test.ClearValue1();
}
//	2.上述的ClearCTestData()系列函数,通常是作为类的辅助工具提供的,将其声明为类的非成员函数,可以降低编译的依存性。

//条款24:若所有参数都可能需要类型转换,那么最好将其声明为类的非成员函数
//1.如下代码:
class CTest
{
public:
	CTest (int nTemValue) : value(nTemValue){}
public:
	const CTest operator * (const CTest& tem) const	{return CTest(value * tem.value);}	//此处之所以不是返回一个引用而是按值返回一个对象,是为了防止引用对象不存在的情况。
	int GetValue() const {return value;}	//为了使得常量对象也能调用此函数,必须将其声明为常量成员函数。
private:
	int value;
};

const CTest FunTest(const CTest &tem0, const CTest &tem1)
{
	return CTest(tem0.GetValue() * tem1.GetValue());
}

CTest Test0(1);
CTest Test1 = Test0 * 2;		//允许通过编译
//CTest Test2 = 2 * Test0;		//不允许通过编译
//之所以CTest Test1 = Test0 * 2;能通过编译,是因为发生了隐式类型转换,将2转换为CTest类型
//之所以CTest Test2 = 2 * Test0;不能通过编译,是因为只有参数位于参数列表中,这个参数才能发生隐式类型转换。

CTest Test2 = FunTest(2, 2);	//允许通过编译,需要隐式转换的参数都位于形参列表中

//条款25:考虑为类写出一个不抛出异常的swap函数
//	1.swap是一个有趣的函数,原本是STL的一部分,而后来成为异常安全性变成的脊柱,以及用来处理自我赋值的可能性。
//	2.当std::swap对自定义的类型效率不高的时候(比如在这个类型中使用了指针指向了一个内存,如此swap应该交换指针而非交换指针所指对象),提供一个swap成员函数,并确定这个函数不抛出异常
//	3.如果提供一个成员函数swap,那么也该提供一个非成员函数版本的swap来调用成员函数版本的swap。
//	4.不要试图往std命名空间中添加新的成员,这种行为是未定义的。
//	5.std::swap
template<class _Alloc>
void swap(_Vb_reference<_Alloc> _Left,
	_Vb_reference<_Alloc> _Right)
{	// swap _Left and _Right vector<bool> elements
	bool _Val = _Left;	// NOT _STD swap
	_Left = _Right;
	_Right = _Val;
}
//	由上述代码可知,当交换的对象包含指针成员的时候,std::swap()的效率往往不高

  

时间: 2024-10-29 19:11:53

Effective C++ 4.设计与声明的相关文章

《Effective C++》设计与声明:条款18-条款19

软件设计是"让软件做你想让它做的事情"的步骤和做法.从一般性的构想开始,逐渐清晰,构造细节,最终设计出良好的接口(interface).这些接口而后变为C++的声明. 下面讲的是关于接口设计和声明的做法.设计接口一个很重要的准则是:让接口容易被正确使用,不容易被误用.这是一个大的准则,细化之后包括很多内容:正确性.高效性.封装性.维护性.延展性以及协议的一致性. 条款18:让接口容易被正确使用,不容易被误用 接口是客户和你的代码交换的唯一手段.如果客户正确使用你开发的接口,那自然很好:

【Effective C++】设计与声明

条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容. 3,“阻止误用”的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. 4,shared_ptr支持定制型删除器.这可以防范DLL问题,可以用来自动解除互斥锁. 条款19:设计class犹如设计type 如何设计你的类: 1,新type的对象应该如何创建和销毁? 影响到的设

读书笔记4: &lt;&lt;Effective C++&gt;&gt;之设计与声明

每一个Item都很经典,都需要去思考揣摩,我在这里将要点抽象出来,便于日后快速回忆:我只是在做文章的"搬运工". Item 18 使接口易于正确使用 1. function接口,class接口,template接口......每一种接口都是客户(调用者)与你的代码互动的手段. 2. 防止可能的客户(调用)错误的另一个方法是:限制类型内什么事可以做什么事不能做:施加限制的一个普通方法就是加上 const. 3. 避免自定义与内置类型不兼容的一个方法是提供行为一致的接口.很少有其他性质比得

《Effective C++》第4章 设计与声明(2)-读书笔记

章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(2)-读书笔记 <Effective C++>第3章 资源管理(1)-读书笔记 <Effective C++>第3章 资源管理(2)-读书笔记 <Effective C++>第4章 设计与声明(1)-读书笔记 <Eff

Effective C++笔记04:设计与声明

条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,"促进正使用"的办法包括接口的一致性,以及与内置类型的行为兼容. 3,"阻止误用"的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. 4,shared_ptr支持定制型删除器.这可以防范DLL问题,可以用来自动解除互斥锁. 条款19:设计class犹如设计type 博客地址:http://blog.csd

[C++]关于接口的设计与声明--对封装性的理解

设计与声明 所谓软件设计,是"令软件做出你希望它做的事情"的步骤和方法,通常以颇为一般性的构想开始,最终十足的细节,以允许特殊接口(interface)的开发.这些接口而后必须转换为C++声明式.本文讨论对良好C++接口的设计和声明. 1. 让接口容易被正确使用,不易被误用 C++拥有许多的接口,function接口,class接口,template接口-.每一种接口实施客户与你的代码互动的手段.理想情况下,客户总是会准确的使用你的接口并获得理想的结果,而如果客户错误的使用了接口,代码

Effective C++笔记(四):设计与声明

参考:http://www.cnblogs.com/ronny/p/3747186.html 条款18:让接口容易被正确使用,不易被误用 1,好的接口很容易被正确使用,不容易被误用.你应该在你的所有接口中努力达成这些性质. 2,“促进正使用”的办法包括接口的一致性,以及与内置类型的行为兼容. 3,“阻止误用”的办法包括建立新类型,限制类型上的操作,束缚对象值,以及消除客户的资源管理责任. 4,shared_ptr支持定制型删除器.这可以防范DLL问题,可以用来自动解除互斥锁. 条款19:设计cl

Effective C++ 笔记:4设计与声明

昨晚睡前看的,果然睡前看点书这个习惯要强制性养成的. 条款18 让接口被正确使用,不要被误用 不易被误用,比如Date(1,2,1991)->Date(Day(1),Month(2),Year(1991));以函数代替对象 条款19 设计类犹如设计type 创建和销毁; copy constructor(定义了pass by value如何实现); 合法值(影响异常的抛出处理); 是否需要配合某个继承图系(inheritance graph,virtual/non-virtual)? 类型转换?

Effective C++ -- 设计与声明

18.让接口容易被正确使用 问题: 接口的参数 接口依赖其他调用 class Date { public: Date(int month,int day, int year; } 以上代码问题: 容易以错误的顺序传递参数 可能传递无效的月份或天数 解决方法: 通过导入新类型获得预防 struct Day { explicit Day(int):val(d){} int val; }; class Date { public: Data(const Month& m, const Day&