【Effective C++读书笔记】篇九(条款22~条款24)

条款22:将成员变量声明为 private                                                                                


1、语法的一致性:

如果成员变量不是 public ,客户唯一能够访问对象的办法就是通过成员函数。如果 public 接口内的每样东西都是函数,客户就不需要在打算访问 class  成员时迷惑地试着记住是否该使用小括号(圆括号)。

2、封装:

如果你通过函数访问成员变量,日后可改以某个计算替换这个成员变量,而 class 客户一点也觉察不到。将成员变量隐藏在函数接口的背后,可以为“所有可能的实现”提供弹性。例如这可使得成员变量被读或被写是轻松通知其他对象、可以验证 class 的约束条件以及函数的前提和事后状态、可以在多线程环境中执行同步控制......等等。东西的封装性与“当其内容改变时可能造成的代码破坏量”成反比。因此对于 public 变量,完全没有封装可言。

假设我们有一个 public 成员变量,而最终我们取消了它。多少代码可能被破坏呢?唔,所有使用它的客户都会被破坏,而那是一个不可知的大量。同理对于 protected 成员变量,而我们最终取消了它,有多少代码被破坏?唔,所有使用它的 derived classes 都会被破坏,那往往也是个不可知的大量。因此,protected 成员变量就像 public 成员变量一样缺乏封装性。


请记住:

1、切记将成员变量声明为 private 。这可赋予客户访问数据的一致性、可细微划分访问控制、允许约束条件获得保证,并提供 class 作者以充分的实现弹性。

2、proteced 并不比 public  更具封装性。




条款23:宁以 non-member、non-friend 替换 member 函数                       


面向对象守则要求,数据以及操作数据的那些函数应该被捆绑在一起,这意味着它建议 member 函数是较好的选择。不幸的是这个建议不正确。这是基于面向对象真是意义的一个误解。面向对象守则要求数据应该尽可能被封装,然而与直观相反地, member 函数带来的封装性比 non-member、non-friend 函数低。这是由于 member 比 non-member、non-friend 函数可以访问的数据多很多。越多的 member、friend 函数,封装性就越差。


请记住:宁可拿 non-member、non-friend 函数替换 member 函数。这样做可以增加封装性、包裹弹性和机能扩充性。





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


之前我们已经了解到了non-explicit 构造函数和类型转换函数的作用,也知道对于像加法、乘法这样的运算符重载最好使用 non-member 函数而非像等于号一样使用 member 函数重载。

首先我们得知道,只有当参数被列于参数列内,这个参数才是隐式类型转换的合格参与者。让加号、乘号成为一个 non-member 函数,即允许编译器在每个实参身上执行隐式类型转换。

例如:

#include <iostream>
using namespace std;

class point
{
	public:
		point(int x = 0, int y = 0):x(x),y(y){}
		int getx() const {return x;}
		int gety() const {return y;}
		void display(){cout << "x = " << x << ", y = " << y << endl;}
	private:
		int x;
		int y;
};

const point operator+(const point& p1, const point& p2)
{
	return point(p1.getx() + p2.getx(), p1.gety() + p2.gety());
}

int main()
{
	point p1;
	point p2(1, 1);
	point result = 2 + p1 + p2;		//整数2被cast为point类型(2, 0)。如果加号为 member 函数,此处编译报错
	result.display();
	return 0;
}



请记住:如果你需要为某个函数的所有参数(包括被 this 指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个 non-member 。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值