zoukankan      html  css  js  c++  java
  • 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”这个keyword还可用于定义模板參数。就像“typename”。

    但keyword“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

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

  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5237427.html
Copyright © 2011-2022 走看看