C++的類和C裡面的struct有什麼區別

來源:互聯網
上載者:User

關於使用大括弧初始化
class和struct如果定義了建構函式的話,都不能用大括弧進行初始化
如果沒有定義建構函式,struct可以用大括弧初始化。
如果沒有定義建構函式,且所有成員變數全是public的話,可以用大括弧初始化。

關於預設存取權限
class中預設的成員存取權限是private的,而struct中則是public的。

關於繼承方式
class繼承預設是private繼承,而struct繼承預設是public繼承。

 

為什麼在C++中存在struct?很多人都會想到這是為了讓C++和C相容,那麼問題就是如何使用C++中的struct和C相容起來。

把C++要交換到C程式的資料在C++程式中聲明成一個struct,然後根據C++中程式的語意選擇繼承或者彙總這個struct,然後在使用的時候就 可以把這個struct封裝起來傳遞到C中或者從C中傳遞到C++。(註:在深入探索C++物件模型中建議使用彙總,而不是繼承,原因是為了和C語言的空 間分布相容,因為在C++引入虛函數,虛繼承導致了衍生類別的空間包括struct的空間和vptr、vbtl,而且vptr、vbtl存放在哪裡由編譯器 自己決定,C++標準中沒有定義)。

給出一個從C++到C語言的一個簡單的例子:

//C++標頭檔moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

struct person
{
       int age;
       char name[20];
};

class male
{
      private:
              int wife;
              struct person per;

      public:
             int getAge()
             {
                return per.age;
              }

};

extern "C" void print(person );

#endif

//C++的實現檔案

#include "moduleA.h"

#include <stdio.h>

void print(person per)
{
        printf("age :%d, /n",per.age);
        return ;
}

/*待處理的C語言檔案*/

#include <stdio.h>

extern "C"
{
       #include "moduleA.h" //或者只要這個也能通過編譯
}

int main(void)
{
       person per;
       per.age = 18;
       print(per);
       return 0;

}

討論一下結構(struct)與類(class)的區別,你認為結構(struct)有些什麼作用,可以完全用類(class)取代嗎??
---------------------------------------------------------------

首先,討論這個問題應該僅從文法上討論,如果討論不同人之間編程風格上的差異,那這個問題是沒有答案的。畢竟不同的人偏好不同。

從文法上,在C++中(只討論C++中)。class和struct做類型定義時只有兩點區別:
(一)預設繼承許可權。如果不明確指定,來自class的繼承按照private繼承處理,來自struct的繼承按照public繼承處理;
(二)成員的預設存取權限。class的成員預設是private許可權,struct預設是public許可權。
除了這兩點,class和struct基本就是一個東西。文法上沒有任何其它區別。

不能因為學過C就總覺得連C++中struct和class都區別很大,下面列舉的說明可能比較無聊,因為struct和class本來就是基本一樣的東西,無需多說。但這些說明可能有助于澄清一些常見的關於struct和class的錯誤認識:
(1)都可以有成員函數;包括各類建構函式,解構函式,重載的運算子,友元類,友元結構,友元函數,虛函數,純虛函數,靜態函數;
(2)都可以有一大堆public/private/protected修飾符在裡邊;
(3)雖然這種風格不再被提倡,但文法上二者都可以使用大括弧的方式初始化:A a = {1, 2, 3};不管A是個struct還是個class,前提是這個類/結構足夠簡單,比如所有的成員都是public的,所有的成員都是簡單類型,沒有顯式聲明的建構函式。
(4)都可以進行複雜的繼承甚至多重繼承,一個struct可以繼承自一個class,反之亦可;一個struct可以同時繼承5個class和5個struct,雖然這樣做不太好。
(5)如果說class的設計需要注意OO的原則和風格,那麼沒任何理由說設計struct就不需要注意。
(6)再次說明,以上所有說法都是指在C++語言中,至於在C裡的情況,C裡是根本沒有“class”,而C的struct從根本上也只是個封裝資料的文法機制。
---------------------------------------------------------------

最後,作為語言的兩個關鍵字,除去定義類型時有上述區別之外,另外還有一點點:“class”這個關鍵字還用於定義模板參數,就像“typename”。但關鍵字“struct”不用於定義模板參數。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.