class、interface、struct的区别

1 struct和class有什么区别

1.1默认的继承访问权限

Struct是public的,class是private的。

你可以写如下的代码:

struct A

{

char a;

};

struct B:A

{

char b;

}

这个时候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 不同点

1)abstract class的成员函数允许有函数体,interface不能

2)abstract class允许有成员变量,interface不能(interface只能含有事件,委托,函数,属性,索引器);

3)abstract class的方法允许含有可见性修饰符,interface不能(默认为public)

4 abstract class不能被多重继承,interface可以被多重继承(实现)

5)abstract class可以拥有构造函数/静态构造函数,interface不可以

3 Class 与abstract Class

3.1 相同点

1) 都可以含有成员变量

2) 成员函数都允许有函数体

3) 都不能多重继承或被多重继承

3.2 不同点

1) class能被实例化,abstract class不能被实例化

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

转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/26088297

class、interface、struct的区别

时间: 2024-12-14 00:07:44

class、interface、struct的区别的相关文章

浅谈c++中class与struct的区别

本文主要讨论class与struct的区别.为什么是区别而不是共同点呢?因为在绝大部分情况下,class和struct其实是可以互相替换的, 那么区别到底有哪些呢,我总结了一下大概有如下3点: 1.成员的默认访问权限不同.如果我们使用struct关键字,则定义在第一个访问说明符之前的成员是public的:相反,如果我们使用class关键字,则这些成员是private的. class A //class { int x; public: A():x(0){} }; struct B<span st

C++中class与struct的区别(struct的类型名同时可以作为变量名)

通常我们知道的区别: (一)默认继承权限.如果不明确指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理: (二)成员的默认访问权限.class的成员默认是private权限,struct默认是public权限. 除了这两点,class和struct基本就是一个东西.语法上没有任何其它区别. 昨天发现一个不知道算不算是区别的东西: struct的类型名同时可以作为变量名,显然class是不可以的,也可以理解,因为class各类型变量定义时直接是类名

Swift中 Class和Struct的区别

类(Class)和结构体(Struct)区别 1.  内存管理方式不一样, 类引用类型, 分配在堆上. 结构体值类型,分配在栈上. 2. 类, 有析构. 结构体不能有析构, playground中测试直接卡死. 3. 结构体构造函数, 会自动生成带参数的构造器.类不会对有初始化赋值的属性, 生成带参数的构造器. 2. 类有继承特性,结构体没有继承特性,自然也不存在对成员属性和成员方法, 类属性和类方法的重载. 正因为结构体没有继承, 所以操作符函数, 需要static修饰, 而不能用class修

class和struct的区别

1.最主要的区别,默认的继承访问权限.struct是public的,class是private的. 2.关于使用大括号初始化 class和struct如果定义了构造函数的话,都不能用大括号进行初始化 如果没有定义构造函数,struct可以用大括号初始化. 如果没有定义构造函数,且所有成员变量全是public的话,可以用大括号初始化. 3.关于默认访问权限 class中默认的成员访问权限是private的,而struct中则是public的. 4.关于继承方式 class继承默认是private继

abstract class和interface有什么区别(转载自:XBOX)

abstract   class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.abstract   class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract   class和interface的选择显得比较随意.其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于设计意图的理解是否正确.

typedef struct和struct 的区别 用途

分三块来讲述:1 首先:      在C中定义一个结构体类型要用typedef:        typedef struct Student        {            int a;        }Stu;于是在声明变量的时候就可:Stu stu1;如果没有typedef就必须用struct Student stu1;来声明这里的Stu实际上就是struct Student的别名.另外这里也可以不写Student(于是也不能struct Student stu1;了)       

abstract ,interface 之间的区别 和 abstract ,native之间的区别

语法区别: abstract:抽象类--有abstract修饰,有构造方法:interface(接口)没有:   有普通的成员变量:   interface 没有: 有非抽象的普通方法: interface 没有: 抽象方法的访问类型是public,protected:     interface 的抽象方法必须是public abstract 修饰:默认是public abstract: 抽象方法中静态成员的类型可以是任意的: interface 的静态成员的类型必须是 public  sta

[C#基础知识]Class和Struct的区别

class和struct语法几乎相同,但其本质却截然不同:class是引用类型,struct是值类型,也就是说在内存中存储方式有别,由此产生的一系列差异性. class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段.属性.方法.构造函数.索引器.事件等.在.NET中,所有的类都继承自System.Object类,是一种引用类型,也就是说,当我们new出一个类的实例时,对象保存了该实例实际数据的引用地址,而对象的值保存在托管堆中. struct(结构)是一种值类型,用于将一

abstract class 和 interface 有什么区别?(抽象类和接口的区别)

抽象类: 含有abstract修饰符的class即为抽象类, abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class, abstract class类中的方法不必是抽象的. abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法. 如果的子类没有实现抽象父类中的所有抽象方法,那么子类也须定义为abstract类型. 接口:接口(interface)可以说成是抽象类的一种特例,