ich das folgende einfache Testprogramm erstellt zu zeigen, dass ich die Adresse der öffentlichen integer können den Wert einer privaten integer zuzugreifen:Verwendung der Adresse eines öffentlichen Membervariable ein eigenes Mitglied zuzugreifen
#include <iostream>
using namespace std;
class CarType{
public:
int year;
CarType(int price, int year){this -> year = year; this -> price = price;};
private:
int price;
};
int main(){
//Create new CarType object
CarType a = CarType(15000, 1999);
//Increment the memory address of public member variable, year by 1 and save the result
int* pricePointer = &a.year+1;
//De-reference the memory address and output it
cout << "PRICE: "<< *pricePointer << endl;
return 0;
}
Die Ausgabe zeigt, dass ich auf die Preisvariable zugreifen kann, indem ich nur die Adresse des Jahres kenne. Gibt es einen Weg, dies zu verhindern? Ist das nur ein Randfall oder gilt das für alle Arten von Objekten?
C++ wird nicht verhindern, dass jemand sich in den Fuß schießt. – songyuanyao
Es gibt keine Garantie, dass das, was Sie tun, immer funktioniert. Im Wesentlichen hat der Compiler in diesem Fall den Speicher so ausgelegt, dass die Variable "price" unmittelbar nach "year" platziert wird. Da Sie jedoch eine Klasse und keinen POD verwenden und der Compiler dem Objekt "Sachen hinzufügt", gibt es keine Garantie dafür, dass der Speicher immer auf diese Weise angelegt wird. Versuchen Sie, andere Membervariablen und -methoden hinzuzufügen, und sehen Sie, was passiert. Siehe Punkt 11 von C++ - Allgemeinwissen von Stephen C. Dewhurst für Details. Andere, die mit den Compiler-Designs besser vertraut sind, könnten mehr Details zur Verfügung stellen. – lightalchemist