class、interface、struct的區別

1 struct和class有什麼區別

1.1默認的繼承訪問權限

Struct是public的,class是private的。數據結構

你能夠寫以下的代碼:函數

struct Athis

{spa

    char a;對象

};繼承

 

struct B:A索引

{事件

    char b;內存

}string

這個時候B是public繼承A的。若是都將上面的struct改爲class,那麼B是private繼承A的。這就是默認時的繼承訪問權限。因此咱們在平時寫類繼承的時候,一般會這樣寫:

struct B:public A

就是爲了指明是public繼承,而不是用默認的private繼承。

struct做爲數據結構的實現體,它默認的數據訪問控制是public的,而class做爲對象的實現體,它默認的成員變量訪問控制是private的。

1.2 模板參數

它們另外一個區別,就是「class」這個關鍵字還可用於定義模板參數,就像「typename」。但關鍵字「struct」不用於定義模板參數。

1.3用{}賦初值

C++中的struct是對C中的struct擴充,既然是擴充,那麼它就要兼容過去C中struct應有的全部特性。例如你能夠這樣寫:

Struct A //定義一個struct

{

char c1;

int n2;

double db3;

};

A a={‘p’, 7, 3.1415626}; //定義時直接賦值

也就是說struct能夠在定義的時候用{}賦初值。那麼class行不行呢?將struct改爲class,試試看,報錯!

若是試着在struct中加入一個構造函數(或虛函數),你會發現struct也不能用{}賦初值了。的確,以{}的方式來賦初值,只是用以個初始化列表對數據進行按順序的初始化,這樣的 操做,只能發生在簡單的數據結構上,而不該該放在對象上。加入一個構造函數或一個虛函數會使struct更體現出一種對象的特性,而使此{}操做再也不有效。事實上,是由於加入這樣的函數,使得類的內部結構發生了變化。而加入一個普通的成員函數呢?你會發現{}依舊可用。

 

那爲何咱們在上面僅僅將struct改爲class,{}就不能用了呢?其實問題恰巧是咱們以前所講的——訪問控制!咱們將struct改爲class的時候,訪問控制由public變成了private了,那固然就不能用{}來賦初值了。加上一個public,你會發現,class也是能用{}的,和struct毫無區別!

咱們能夠看出,struct更適合當作是一種數據結構的實現體,class更適合當作是一個對象的實現體。

1.4 值類型和引用類型

Struct是值類型,它在內存中的存儲方式是存儲於堆(heap)上,Class是引用類型,它在內存中的存儲方式是存儲於棧(stack)上。

使用實例:

//以下語句定義一個struct,struct是封閉的,因此它不能做爲其餘結構或者類的基,同時,它也不能基於其餘類或者結構

public struct StudentS {

   public int age;

   public string name;

   //重要:struct不能含有默認構造函數,以下語句報錯

   public StudentS() {}

   //可是能夠定義含有參數的構造函數

public StudentS(int age, string name)

{

       this.age = age;

       this.name = name;

}

}

 

//以下語句定義一個class

public class StudentC

{

   public int age;

public string name;

}

 

public class ClassMain

{

public static void Main()

{

       //以下語句聲明這個struct:

       StudentS xiaoMing;

       //給age賦值,由於struct類型(值類型),因此一旦被聲明,就被分配了內存

       xiaoMing.age = 20;

       //可是,若是不初始化就使用對象的值,則會報錯:use of unassigned field

       Console.WriteLine(xiaoMing.name);

       //應該賦值:

       xiaoMing.name = "XiaoMing";

       Console.WriteLine(xiaoMing.name);

       //或者使用new顯式初始化:

       xiaoMing = new StudentS();

       Console.WriteLine(xiaoMing.name);

       //以下語句聲明這個class:

       StudentC xiaoFang;

       //以下語句初始化這個class

       //重要!對於class來講,必定要使用new來進行顯式的初始化,如不顯式初始化則會報錯

       xiaoFang = new StudentC();

       xiaoFang.age = 20;

   }

}

 

2 Abstruct class Interface的區別

2.1 相同點

1)都不能被初始化;

2都支持抽象方法;

 

2.2 不一樣點

1abstract class的成員函數容許有函數體,interface不能

2abstract class容許有成員變量,interface不能(interface只能含有事件,委託,函數,屬性,索引器);

3abstract class的方法容許含有可見性修飾符,interface不能(默認爲public

4 abstract class不能被多重繼承,interface能夠被多重繼承(實現)

5abstract class能夠擁有構造函數/靜態構造函數,interface不能夠

3 Class 與abstract Class

3.1 相同點

1 均可以含有成員變量

2 成員函數都容許有函數體

3 都不能多重繼承或被多重繼承

3.2 不一樣點

1 class能被實例化,abstract class不能被實例化

2 class不能含有抽象方法,abstract能

相關文章
相關標籤/搜索