新命令在堆中分配内存来存储对象。静态分配可能会导致对象被放到堆栈上。但它们都不是受保护的内存区域。我可以访问它,它只是对象的地址,然后使用间接操作符,因此指向对象字段:
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类(实例化对象)以避免指向其数据?
发布于 2012-03-02 03:07:23
编程中的封装通常并不意味着“如果你真的真的尝试过,就不可能解决”。
它通常意味着更接近于“能够清楚地区分什么应该暴露,什么不应该暴露,并且不会意外暴露或使用东西”。
我不认为任何人会把你的代码误认为访问字符串的方式。
发布于 2012-03-02 03:17:14
C++是一种功能强大的语言。正如一位漫画超级英雄曾经说过的那样,伟大的力量伴随着伟大的责任。
一旦您将对象指针强制转换为void*,然后将该指针重新强制转换为另一种类型,在本例中为char*,您就进入了未定义行为的领域。如果您尝试使用那个char*指针,该语言不能保证什么可以工作,什么不能工作。只有将void*重新转换回原始类型(string*)才是合法的。
调用未定义的行为不是破坏封装的合法方式,因为一旦超过了未定义的行为阈值,任何都是可能的(只是不可移植)。
发布于 2012-03-02 03:10:36
您的代码隐式依赖于std::string的特定实现。换句话说,您的代码破坏了std::string的封装。更糟糕的是,它调用了未定义的行为,所以它可能工作,也可能不工作,或者可能崩溃……
https://stackoverflow.com/questions/9522221
复制相似问题