2013-10-04 125 views
0

我是C++的新手,我被告知結構和類幾乎是一樣的。主要區別在於C++中的類默認是私有的,而結構是公共的。使用指向類成員和結構成員的指針之間的區別

我有兩個不同的代碼,我們使用指針來構造成員和類成員。

struct Simple { int a; }; 
int main() { 
Simple so, *sp = &so; 
sp->a; 
so.a; 
} 

我們以上述方式使用指針指向struct成員。

爲什麼我們必須按照以下方式使用指向類成員的指針?

class X { 
public: 
    int a; 
    void f(int b) { 
    cout << "The value of b is "<< b << endl; 
    } 
}; 

int main() { 

    // declare pointer to data member 
    int X::*ptiptr = &X::a; 
    int X::*ptiptr1 = &X::a; 

    // create an object of class type X 
    X xobject,xobject1; 

    // initialize data member 
    xobject.*ptiptr = 10; 
    xobject->*ptiptr1 = 11; 

} 

爲什麼我們首先聲明一個指向類數據成員的指針?爲什麼我們不能像我們爲結構做的那樣做呢?

請幫我一下。謝謝。

+2

除了成員和基類的默認訪問權限(public與'private')之間'類'和'結構'。 – juanchopanza

+0

你正在比較蘋果和橘子,並抱怨他們不一樣。 –

回答

3

你在這裏做了兩件完全不同的事情。

第一個是創建一個正常的對象指針到一個特定的對象。這是指該對象,並可用於訪問其任何成員。

第二個創建指針指向成員,這與對象指針非常不同。它指的是一個類成員,而不是一個特定的對象,並且可以應用於任何對象來訪問該成員。

在任何一種情況下,使用class還是struct關鍵字來定義類是無關緊要的。這隻會影響會員是否默認爲私人或公共。

1
struct S { 
    int a; 
}; 

class C { 
public: 
    int a; 
}; 

而在同你做了什麼struct

S so, *sp = &so; 
sp->a = 3; 
so.a = 3; 

你還可以做class

C co, *cp = &co; 
cp->a = 3; 
co.a = 3; 

而且關於指針到成員:這樣的指針需要使用該實例struct/class才能用於訪問此成員。非靜態成員是特定於對象的,因此指針本身是無用的,除非您有一個對象,其成員可以訪問:

S so; 
int S::* memberPtr = &S::a; 
so.*memberPtr = 3;