Мой друг сделал этот код, который получит доступ к памяти класса и изменит значение частной переменной.C++ доступ к классу памяти и изменение личной переменной
#include <iostream>
using namespace std;
class has_private_variable
{
private:
const int member1;
public:
has_private_variable()
: member1(5) //initializer list. In case you haven't seen that before
{
}
int getMember1()
{
return member1;
}
};
int main()
{
has_private_variable hpv;
int tmp = hpv.getMember1();
cout << hpv.getMember1() << endl;
char* ptr = (char*)&hpv; //Yeah this will generate all types of warnings hopefully
//find the actual address of the member
while (*(int*)ptr != tmp)
ptr++;
int* ptr_int = (int*)ptr;
*ptr_int = 3;
cout << hpv.getMember1() << endl;
//There's a joke in here about hpv.vaccinate(), but I can't be bothered to find it
return 0;
}
Умение делать это похоже на то, что оно уничтожает всю точку с частной переменной. Есть ли способ остановить программиста от доступа к частной переменной?
Edit:
Из комментариев я получаю, мой друг вызывая неопределенное поведение C++. Но может ли быть так, чтобы программист, возможно, не смог этого сделать?
Процитировать @ Jerry Coffin: «C++ пытается защитить от несчастных случаев, а не преднамеренную подрывную деятельность (иначе« защищает от Мерфи, а не Макиавелли »)». – vsoftco
Или: C++ не мешает вам делать то, что вы хотите (что должно быть сделано). Он только предупреждает вас, если он выглядит опасным, и вы не утверждали, что правы. – Deduplicator
Ваш друг вызвал неопределенное поведение, которое по чистой вероятности привело к доступу к частной переменной. [Читайте о неопределенном поведении здесь] (http://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior). –