首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表观封装

表观封装
EN

Stack Overflow用户
提问于 2012-03-02 02:56:31
回答 3查看 89关注 0票数 0

新命令在堆中分配内存来存储对象。静态分配可能会导致对象被放到堆栈上。但它们都不是受保护的内存区域。我可以访问它,它只是对象的地址,然后使用间接操作符,因此指向对象字段:

代码语言:javascript
复制
string str=string("hello");
void** str_this=(void**)&str;
char* str_data= (char*)*str_this;
str_data[0]='s';
str_data[1]=0;
cout <<str_data; // prints "sello"

那么,这仍然被认为是封装吗?是否负责user类(实例化对象)以避免指向其数据?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-02 03:07:23

编程中的封装通常并不意味着“如果你真的真的尝试过,就不可能解决”。

它通常意味着更接近于“能够清楚地区分什么应该暴露,什么不应该暴露,并且不会意外暴露或使用东西”。

我不认为任何人会把你的代码误认为访问字符串的方式。

票数 6
EN

Stack Overflow用户

发布于 2012-03-02 03:17:14

C++是一种功能强大的语言。正如一位漫画超级英雄曾经说过的那样,伟大的力量伴随着伟大的责任。

一旦您将对象指针强制转换为void*,然后将该指针重新强制转换为另一种类型,在本例中为char*,您就进入了未定义行为的领域。如果您尝试使用那个char*指针,该语言不能保证什么可以工作,什么不能工作。只有将void*重新转换回原始类型(string*)才是合法的。

调用未定义的行为不是破坏封装的合法方式,因为一旦超过了未定义的行为阈值,任何都是可能的(只是不可移植)。

票数 3
EN

Stack Overflow用户

发布于 2012-03-02 03:10:36

您的代码隐式依赖于std::string的特定实现。换句话说,您的代码破坏了std::string的封装。更糟糕的是,它调用了未定义的行为,所以它可能工作,也可能不工作,或者可能崩溃……

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9522221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档