访问说明符不是万无一失的?

Naw*_*waz 2 c++ macros encapsulation access-specifier

如果我是这样的一个班级,

class Sample
{
private:
      int X;
};
Run Code Online (Sandbox Code Playgroud)

然后我们无法从外部访问X,所以这是非法的,

    Sample s;
    s.X = 10; // error - private access
Run Code Online (Sandbox Code Playgroud)

但是我们可以在不编辑课程的情况下访问它!我们需要做的就是这个,

#define private public  //note this define!

class Sample
{
private:
      int X;
};

//outside code
Sample s;
s.X = 10; //no error!
Run Code Online (Sandbox Code Playgroud)

ideone上的工作代码:http://www.ideone.com/FaGpZ

这意味着,我们可以通过在类定义之前或之前定义这样的宏来更改访问说明符#include <headerfile.h>,

#define public private //make public private
//or
#define protected private //make protected private
//or
#define so on
Run Code Online (Sandbox Code Playgroud)

这不是C++的问题(宏/访问说明符/什么)?

无论如何,这个主题的重点是:

使用宏,我们很容易违反封装.访问说明符并非万无一失!我对吗?

GMa*_*ckG 7

首先,这样做是违法的.private是一个关键字,您不能将其用作宏中的标识符; 你的程序将是不正确的.

但无论如何,它根本不是宏的问题.这是傻瓜以愚蠢的方式使用它们.:)(他们在那里帮助你保持安全,无论你怎么做,他们都不会帮助你安全并阻止他们访问它们.C++可以防止Murphy,而不是Machiavelli.)

请注意,您可以以格式良好且定义明确的方式访问private,如此处所示.再一次,这不是语言的问题,只是语言的工作不仅仅是为了保持窥探而不必要.

  • @Nawaz:请参阅http://stackoverflow.com/questions/2726204/c-preprocessor-define-ing-a-keyword-is-it-standards-conforming. (3认同)

jal*_*alf 6

但是我们可以在不编辑课程的情况下访问它!我们需要做的就是这个,

从技术上讲,你所展示的只是"我们可以将合法程序变成未定义的行为",而无需编辑一个特定的类.

那不是新闻.你也可以通过在以下的末尾添加这样的行来将其转换为未定义的行为main():

int i = 0;
i = ++i;
Run Code Online (Sandbox Code Playgroud)

C++中的访问说明符不是安全功能它们不能防止黑客攻击,并且它们不会防止人们故意试图将错误引入代码中.

它们只是允许编译器帮助您维护某些类不变量.如果您不小心尝试访问私有成员,它们允许编译器通知您,就像它是公共的一样.你所展示的只是"如果我特意试图打破我的计划,我可以".希望这对任何人来说都应该是一个惊喜.

正如@Gman所说,重新定义C++语言中的关键字是未定义的行为.它可能似乎适用于您的编译器,但它不再是一个定义良好的C++程序,编译器原则上可以做任何它喜欢的事情.