类成员变量私有化
类成员变量私有化,通过读写函数进行访问,这样一方面提供了一致的方式(函数)进行类成员变量访问,另一方面为以后的变化提供便宜。看下面的代码:
再比如,程序要求对所有使用类型a的变量x的地方都进行日志记录工作,同样我们需要在所有使用变量x的地方进行记录工作。
这将是我们不愿意看到的,为什么这些工作不能在不改变客户代码的情况下透明化的进行?答案是可以的,下面给出修改后的实现代码:
总结:类中成员变量应该保持私有化,通过读写器进行访问,这样的封装代码具有较好的扩展性。
1
class a
2
{
3
public:
4
a(int x):x(x)
5
{
6
7
}
8
~a()
9
{
10
11
}
12
public:
13
int x;
14
};
15
16
void f1(const a& a1)
17
{
18
cout << a1.x << endl;
19
}
20
void f2(const a& a1)
21
{
22
cout << a1.x*a1.x << endl;
23
}
函数f1, f2依赖于class a 的成员变量x, 也就是直接读取了类型a的变量x的值。假设有一天,变量x读取是通过计算后获得,也就是说x的读取语意发生变化(比如现在的读取语意是x*x),这个时候所有依赖于类型a的成员x的代码都要发生变化。。。
class a2
{3
public:4
a(int x):x(x)5
{6

7
}8
~a()9
{10

11
}12
public:13
int x;14
};15

16
void f1(const a& a1)17
{18
cout << a1.x << endl;19
}20
void f2(const a& a1)21
{22
cout << a1.x*a1.x << endl;23
}再比如,程序要求对所有使用类型a的变量x的地方都进行日志记录工作,同样我们需要在所有使用变量x的地方进行记录工作。
这将是我们不愿意看到的,为什么这些工作不能在不改变客户代码的情况下透明化的进行?答案是可以的,下面给出修改后的实现代码:
1
class a
2
{
3
public:
4
a(int x):x(x)
5
{
6
7
}
8
~a()
9
{
10
11
}
12
public:
13
int GetX() const
14
{
15
//log
16
return x*x;
17
}
18
private:
19
int x;
20
};
21
22
void f1(const a& a1)
23
{
24
cout << a1.GetX() << endl;
25
}
26
void f2(const a& a1)
27
{
28
cout << a1.GetX()*a1.GetX() << endl;
29
}
class a2
{3
public:4
a(int x):x(x)5
{6

7
}8
~a()9
{10

11
}12
public:13
int GetX() const14
{15
//log16
return x*x;17
}18
private:19
int x;20
};21

22
void f1(const a& a1)23
{24
cout << a1.GetX() << endl;25
}26
void f2(const a& a1)27
{28
cout << a1.GetX()*a1.GetX() << endl;29
}总结:类中成员变量应该保持私有化,通过读写器进行访问,这样的封装代码具有较好的扩展性。


浙公网安备 33010602011771号