惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
The Cloudflare Blog
G
Google Developers Blog
博客园_首页
Martin Fowler
Martin Fowler
Apple Machine Learning Research
Apple Machine Learning Research
L
LangChain Blog
D
Docker
C
Check Point Blog
T
Tailwind CSS Blog
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
Microsoft Security Blog
Microsoft Security Blog
V
V2EX
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss
酷 壳 – CoolShell
酷 壳 – CoolShell
IT之家
IT之家
M
MIT News - Artificial intelligence
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
GbyAI
GbyAI

博客园 - 小峰

反思下 [.net] 将 datatable 存储到数据库 - 小峰 要上班了 表达式模版学习笔记 模版元编程学习笔记 模版默认参数小探 boost serialization 试用 套接字 io 模型 小结 精简版 rtti class 能不能这么写 boost/format试用 设计模式小结 接口版本演化引发的思考二 c# 程序最小化到系统托盘 [xna]帧数 皆是#惹的祸 [xna]键盘 代码片段 单元测试
类成员变量私有化
小峰 · 2006-11-26 · via 博客园 - 小峰

   类成员变量私有化,通过读写函数进行访问,这样一方面提供了一致的方式(函数)进行类成员变量访问,另一方面为以后的变化提供便宜。看下面的代码:

 1class a
 2{
 3public:
 4    a(int x):x(x)
 5    {
 6
 7    }

 8    ~a()
 9    {
10
11    }

12public:
13    int x;
14}
;
15
16void f1(const a& a1)
17{
18    cout << a1.x << endl;
19}

20void 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的代码都要发生变化。。。
   再比如,程序要求对所有使用类型a的变量x的地方都进行日志记录工作,同样我们需要在所有使用变量x的地方进行记录工作。
   这将是我们不愿意看到的,为什么这些工作不能在不改变客户代码的情况下透明化的进行?答案是可以的,下面给出修改后的实现代码: 

 1class a
 2{
 3public:
 4    a(int x):x(x)
 5    {
 6
 7    }

 8    ~a()
 9    {
10
11    }

12public:
13    int GetX() const
14    {
15        //log
16        return x*x;
17    }

18private:
19    int x;
20}
;
21
22void f1(const a& a1)
23{
24    cout << a1.GetX() << endl;
25}

26void f2(const a& a1)
27{
28    cout << a1.GetX()*a1.GetX() << endl;
29}

   总结:类中成员变量应该保持私有化,通过读写器进行访问,这样的封装代码具有较好的扩展性。