网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
01月14日
漏签
0
天
c++吧
关注:
593,853
贴子:
2,106,155
看贴
图片
吧主推荐
游戏
32
回复贴,共
1
页
<<返回c++吧
>0< 加载中...
这个private不管用啊!class t {private
只看楼主
收藏
回复
savage200
<<
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这个private不管用啊!
class t {
private: //
int a;
int *p;
public:
t()
{
a = 0;
p = &a;
}
int *getp() {return p;}
void printa(){printf("%d\n",a);}
~t() {}
};
int main() {
t a;
a.printa();
int *p=a.getp();
*p=250;
a.printa();
}
M_P_C_King
<
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
打回去重修,访问控制只影响名字。
抬头望那苍穹
==
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
哪里显示不管用了。
savage200
<<
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
只能这样改进:
const int *getp(return p;)
savage200
<<
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
不过也只能防止无意的修改。
对这种也没有办法:
int *p=(int *)a.getp();
M_P_C_King
<
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
标准库减少暴露裸指针做的努力大约你是看不见的
封装的意义在于通过仅提供接口来维持类的内部状态,都提供get了还封个蛋……你的封装仅仅是为了避免手滑写错,像隔壁java那样把一个公开数据变成私有数据再搭上set/get方法?
再说了,不提供get方法,真的就改不了了? *(int**)((int*)(&a) + 1)是什么?
Sunchy321
(int)
16
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
你自己提供的接口,关破坏封装屁事。。
snjtie
throw
3
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
#include <iostream>
using namespace std;
class t
{
private://
int a;
int *p;
public:
t()
{
a = 0;
p = &a;
}
const int *getp()const
{
return p;
}
void printa()
{
printf("%d\n", a);
}
~t()
{
}
};
int main()
{
t a;
a.printa();
const int *p = a.getp();
*p = 250;
a.printa();
}
zarelaky
,
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
只要有对象指针,利用c/c++的指针运算和强制类型转换,要想破坏访问控制,总会有办法的。
楼主的例子,开放的getp()接口,本身就暴露了类实现的细节,将内部数据地址暴露给外部使用,数据已经脱离了类的管控,能被外部修改也就不奇怪。
通常这是违反类设计原则的,一般来说一个类只暴露接口给外部使用,为了避免这种情况,在稍复杂一点的系统设计时,可以通过聚合、组合、提取父类等手段,将类拆分,重组,使对应数据放置到一个合适的类中进行处理。
推荐楼主看看面向对象设计相关的书,另外类设计可以看看《设计模式》和《重构改善既有代码设计》,如果仅仅是练习编程语言的特性,就当我上面的东西白说,但说实话,c/c++真不是这么玩的。
Baka9
<<
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
私有的就不要交出指针,不然又什么意义。要不就公有算了。
savage200
<<
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
但为了简化设计,不得不传递指针
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示