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的。
它們另外一個區別,就是「class」這個關鍵字還可用於定義模板參數,就像「typename」。但關鍵字「struct」不用於定義模板參數。
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更適合當作是一個對象的實現體。
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;
}
}
1)都不能被初始化;
2)都支持抽象方法;
1)abstract class的成員函數容許有函數體,interface不能
2)abstract class容許有成員變量,interface不能(interface只能含有事件,委託,函數,屬性,索引器);
3)abstract class的方法容許含有可見性修飾符,interface不能(默認爲public)
4 abstract class不能被多重繼承,interface能夠被多重繼承(實現)
5)abstract class能夠擁有構造函數/靜態構造函數,interface不能夠
1) 均可以含有成員變量
2) 成員函數都容許有函數體
3) 都不能多重繼承或被多重繼承
1) class能被實例化,abstract class不能被實例化
2) class不能含有抽象方法,abstract能