1. 程式人生 > >C++物件中的私有成員變數可以被訪問

C++物件中的私有成員變數可以被訪問

 C++物件中的私有(保護)成員變數也可以從物件外面訪問。下面的程式碼會讓你大吃一驚:

#include <iostream.h>

class TestClass{
private:
   int  a;
   char b;
public:
   char c;
   TestClass(): a(29), b('b'), c('c'){ }
};

void main(void)
{
   TestClass* pObject = new TestClass();
 
   int *p_int_a =  (int*)pObject;
   cout <<"The value of pointer p_int_a is: " << *p_int_a++ << endl;
 
   char *p_char_b = (char*)p_int_a;
   cout << "The value of pointer p_char_b is: " << *p_char_b++ << endl;
 
   cout << "The value of pointer p_char_b is: " << *p_char_b << endl;
}

輸出結果為:

The value of pointer p_int_a is: 29
The value of pointer p_char_b is: b
The value of pointer p_char_b is: c
請按任意鍵繼續. . .

為什麼會這樣?原因很簡單:在C++中,private, protected只是程式邏輯上的一種保護,

即如果破壞了這種規則(從物件外面訪問private,protected成員),只是在編譯器哪兒通不過。

但通過指標可以直接讀取物件中的私有變數,當然,前提是知道物件中成員變數的順序和型別,否則讀取的資料與我們需要的有偏差!

相關推薦

C++怎麼用指標訪問私有成員變數

C++類中的私友成員是不能通指標操作的。但是總有方法可以做到。可以用: 類中Public 成員指標指向私友成員。 這時類外部的成員可以操作Public成員指標,間接的操作類私成員。#include <iostream> using namespace std; c

有關C++類資料成員變數定義的一些想法

最近開始學習C++,以前是學C的,對C++新生的類不是很懂,最近在看一些教程,發現有的教程只是簡單的告訴你什麼是類,還有怎麼使用類,但對於類的標準啥的並沒有進行標準化的介紹。 關於C++類中成員變數的定義,一般都是推薦這樣定義: 1.類中的屬性(不是函式)最好定義標準化,並且取名字能讓其

C++基類私有成員繼承嗎

1.派生類間接訪問基類私有成員 在類的繼承中,基類私有成員在派生類中是“不可見“的,這種”不可見“是指在派生類的成員函式中,或者通過派生類的物件(指標,引用)不能直接訪問它們。但是,不能直接訪問並不代表不能訪問。在派生類還是能夠通過呼叫基類的共有函式的方式來間

C++物件私有成員變數可以訪問

 C++物件中的私有(保護)成員變數也可以從物件外面訪問。下面的程式碼會讓你大吃一驚: #include <iostream.h> class TestClass{ private: int a; char b; public: cha

(C++)在類外訪問一個類私有成員變數

通過公共函式為私有成員賦值 #include <iostream> using namespace std; class Test { privat

定義一個包含私有成員變數和函式的類,再定義一個內部類,在內部類函式訪問外部成員變數,並呼叫外部函式。在外部類函式建立內部類物件,呼叫內部類函式

public class Test5 {         //定義包含私有成員變數和函式         private int a = 201320883;         private voi

C++類的訪問許可權針對的是類而不是物件!(為什麼類的函式可以訪問物件私有成員?)

我們首先看一段程式: class A { private: int i; public: A(int i): i(i) {} void print(A a) { cout << a.i <<e

[C#]如何訪問及調用類私有成員及方法

exceptio 分享 flags 網址 網頁 控制 .text 代碼 我們 原文:[C#]如何訪問及調用類中私有成員及方法 本文為原創文章、源代碼為原創代碼,如轉載/復制,請在網頁/代碼處明顯位置標明原文名稱、作者及網址,謝謝! 開發工具:VS2017 語言:C

javafianl修飾的物件型別的成員變數與基本型別的成員變數

被fianl修飾的物件型別的成員變數 final修飾的成員變數,其值是不能改變的(這裡的值指的是物件的引用)。必須進行初始化。另外,在一般情況下建立物件的時候,系統都是對其成員變數進行預設初始化的,一旦被fianl修飾的成員變數是不會被初始化的 public class FinalD

新手學C/C++:C++的類靜態成員函式可以訪問私有成員嗎?為什麼?

類的所有成員函式都可以訪問本類的私有成員,但是靜態成員函式沒有this指標,因此通過 該類的物件作為函式引數,可以顯示訪問該類的私有成員。 測試程式如下: #include <stdio.h>   class Demo { private: &n

c++對類私有成員的靜態變數初始化

1.static成員的所有者是類本身和物件,但是多有物件擁有一樣的靜態成員。從而在定義物件時不能通過建構函式對其進行初始化。 2.靜態成員不能在類定義裡邊初始化,只能在class body外初始化。 3.靜態成員仍然遵循public,private,protected訪問準

C++】 私有成員變數的理解

轉載地址:https://www.cnblogs.com/oraser/p/5888116.html 【C++】 私有成員變數的理解 私有成員變數的概念,在腦海中的現象是,以private關鍵字宣告,是類的實現部分,不對外公開,不能在物件外部訪問物件的私有成員變數. 然而,在實現拷貝建構

C++靜態成員變數和靜態成員函式的用法

昨天在修改專案函式功能時,在其中一個類中添加了一個靜態成員變數和兩個靜態成員函式,結果在連結時出現一個非常典型的錯誤:“The following symbols referenced in processor “p0” could not be resolve

Java靜態成員變數,靜態程式碼塊,靜態內部類何時初始化?

關於這個問題,本文不扯理論,直接上程式碼,通過結果來驗證結論,廢話少說,測試程式碼如下: public class StaticTest { public static StaticMember staticMember = new Static

C++(三十二) — 常物件、常成員變數、常成員函式

  常量:對於既需要共享、又需要防止改變的資料。在程式執行期間不可改變。 1、常物件    資料成員值在物件的整個生存期內不能改變。在定義時必須初始化,而且不能被更新。    常物件,只能呼叫常成員函式,保證常物件的資料成員不被改變。 class point { public

靜態成員函式不可以訪問成員變數

原因:因為靜態成員函式在類物件構造時沒有分配this指標(非靜態成員函式則具有this指標),相當於是全域性函式,是屬於類的,而類的成員變數只有類物件(例項)能夠訪問,成員變數只有例項化才有意義。 解決辦法:靜態成員函式增加一個類的指標或引用作為引數。如

javastatic特殊性和final(static成員直接訪問,this不能用在static方法,static不可訪問非static)

java的static關鍵字 java中,static修飾的成員變數和成員方法叫靜態變數和靜態方法,不依賴類特定的例項,被類的所有例項共享。 static的方法和變數可直接用類名訪問; java中,Static類方法和類變數,先於例項(物

C++ 虛指標、成員變數與類物件的偏移地址

先給出一段程式碼實現#include <iostream> using namespace std; class animal { protected: int age; public: virtual void print_age(void)

C++之常物件、常成員變數與常成員函式詳解

一、常物件說明:常物件是指物件的資料成員的值在物件被呼叫時不能被改變。常物件必須進行初始化,且能被更新。不能通過常物件呼叫普通成員函式,但是可以通過普通物件呼叫常成員函式。常物件只能呼叫常成員函式

不用友元,訪問類的私有成員變數的方法

   雖然沒有現實意義,但對理解C++的物件模型是很有幫助的。    前幾天,在論壇裡看到一個帖子,內容是:     (原帖見:http://community.csdn.net/Expert/topic/5014/5014384.xml?temp=.3018152)