zoukankan      html  css  js  c++  java
  • C++: class和struct(一)

    1.引言

    提起class和struct,我们率先的感受是语法几乎雷同,待遇却翻天复地。历史将接力棒由面向过程编程传到面向对象编程,class和struct也担负着各自的命运前行。在我感受,struct英雄迟暮,class天下独行,最性质的差异是class是引用种类,而struct是值种类,它们在内存中的分配情形有所差异。由此发生的一系列差异性,本文将做以全面谈论。

    2. 大约观念

    2.1. 什么是class?

    class(类)是面向对象编程的大约观念,是一种自定义数据构造种类,等闲包括字段、属性、措施、属性、构造函数、索引器、垄断符等。因为是大约的观念,因而无须在此翔实描写,读者能够查询相干观念打听。我们关键偏重的是.NET中,所有的类都最后继承自System.Object类,因而是一种引用种类,也即便说,new一个类的实例时,对象保留了该实例切实数据的引用地址,而对象的值保留在托管堆(managed heap)中。

    2.2. 什么是struct?

    struct(构造)是一种值种类,用于将一组相干的消息变量组织为一个单一的变量实体。所有的构造都继承自System.ValueType类,因而是一种值种类,也即便说,struct实例分配在线程的堆栈(stack)上,它本身存储了值,而不包括指向该值的指针。因而在利用struct时,我们能够将其当作int、char这么的大约种类类看待。
    3. 雷同点,不同点

    雷同点:语法相仿。

    不同点: class是引用种类,继承自System.Object类;struct是值种类,继承自System.ValueType类,因而不具多态性。然而当心,System.ValueType是个引用种类。 从职能见解来看,class出现为行动;而struct常用于存储数据。 class扶持继承,能够继承自类和接口;而struct未曾继承性,struct不能从class继承,也不能作为class的基类,但struct扶持接口继承(记得吗,《第二回:对笼统编程:接口和笼统类》也做过谈论) class能够声明无参构造函数,能够声明析构函数;而struct只能声明带参数构造函数,且不能声明析构函数。因而,struct未曾自定义的默认无参构造函数,默认无参构造器只是容易地把所有值初始化为它们的0等价值 实例化时,class要利用new关键字;而struct能够不利用new关键字,struct在声明时就举行了初始化过程,所有的成员变量均默感受0或null。 class能够实笼统类(abstract),能够声明笼统函数;而struct为笼统,也不能声明笼统函数。 class能够声明protected成员、virtual成员、sealed成员和override成员;而struct不能够,然而划算当心的是,struct能够重载System.Object的3个虚措施,Equals()、ToString()和GetHashTable()。 class的对象复制分为浅拷贝和深拷贝(该主题我们在本系列尔后的主题中将关键解说,本文不作详述),定然穿越尤其的措施来告终复制;而struct创立的对象复制容易,能够直接以等号连接即可。 class实例由草芥回收机制来保证内存的回收处理;而struct变量利用完后即刻积极肃清内存分配。 作为参数递交时,class变量是以按址措施递交;而struct变量是以按值措施递交的。

    我们能够容易的会意,class是一个能够动的机器,有行动,有多态,有继承;而struct即便个零件箱,组合了不同构造的零件。其实,class和struct最性质的差异就在于class是引用种类,内存分配于托管堆;而struct是值种类,内存分配于线程的堆栈上。由此差异,导致了上述所有的不同点,因而只有深长的会意内存分配的相干内容,能力更好的驾驶。本系列将再尔后的内容中,将引用种类和值种类做以深入的比拟和摸索,敬请关怀。当然正如本文题目描写的一样,利用class大约能够轮换struct的任何场合,class尔后居上。固然在某些方面struct有功能方面的优势,然而在面向对象编程里,大约是class横行的天下。

    那么,有人难免会提出,既然class几乎能够全面轮换struct来告终所有的功能,那么struct还有存在的必需吗?答案是,起码在以下情形下,鉴于功能上的琢磨,我们该当琢磨利用struct来轮换class: 告终一个重要用于存储数据的构造时,能够琢磨struct。 struct变量具有堆栈的空间,因而只实用于数据量相对小的场合。 构造数组具有更高的效率。 供给某些和非托管代码通信的接受性。

    所有这些是struct有一席之地的原因,当然可能还有其他的更多说法,只是我不懂得而已:-)

    4. 经典示例

    4.1 小菜一碟

    下面以示例为解释,来阐述本文的大约法定,翔实见注释内容。
    (1)定义接口
    inte***ceIPerson
    {
    voidGetSex();
    }

    (2)定义类publicclassPerson
    {
    publicPerson()
    {
    }

    publicPerson(stringname,珑抬头颈椎牵引器intage)
    {
    _name=name;
    _age=age;
    }

    privatestring_name;

    publicstringName
    {
    get{return_name;}
    set{_name=value;}
    }

    privateint_age;

    publicintAge
    {
    get{return_age;}
    set{_age=value;}
    }
    }

    (3)定义构造//能够继承自接口,不可继承类或构造
    structFamily:IPerson
    {
    publicstringname;
    publicintage;
    publicbool***;
    publicstringcountry;
    publicPersonperson;

    //不能够包括显式的无参构造函数和析构函数
    publicFamily(stringname,intage,bool***,stringcountry,Personperson)
    {
    this.name=name;
    this.age=age;
    this.***=***;
    this.country=country;
    this.person=person;
    }

    //不能够告终protected、virtual、sealed和override成员
    publicvoidGetSex()
    {
    if(***)
    Console.WriteLine(person.Name+"isaboy.");
    else
    Console.WriteLine(person.Name+"isagirl.");
    }

    publicvoidShowPerson()
    {
    Console.WriteLine("Thisis{0}from{1}",newPerson(name,22).Name,country);
    }

    //能够重载ToString虚措施
    publicoverridestringToString()
    {
    returnString.Format("{0}is{1},{2}from{3}",person.Name,age,***?"Boy":"Girl",country);
    }
    }

    (4)测验构造和类


    猜猜运行收获如何,能够顺便察看察看对这个观念的认识。

    4.2.NET琢磨

    在.NET框架中,System.Drawing命名空间中的有些元素,如System.Drawing.Point即便告终为struct,而不是class。其起因也正在于以上推荐的各方面的权衡,大家能够就此琢磨琢磨,能够经验更多。另外,还有以struct告终的System.Guid。

    5. 结论

    对大约观念的掌握,是我们举行技巧深入摸索的必经之路,本系列的主旨也是能够从大约框架中,提供给大家一个通往高级技巧的必修课程。本文关于class和struct的谈论即便如此,在.NET框架中,关于class和struct的谈论将波及到对引用种类和值种类的认识,并且进一步将触角伸向变量内存分配这一高级主题,因而我们有必需来打听其运行机制,掌握差异和利用处所,以便在等闲的系统设计中掌握好对这一观念层次的掌握。

    转自:http://kckgpi.blog.sohu.com/178706246.html

  • 相关阅读:
    课程总结1
    网站概要设计说明书
    数据库设计说明书
    团队项目之7天工作计划
    NABC
    敏捷开发综述
    二维数组最大子数组
    电梯调度
    输出整数数组中 最大的子数组的结果
    【自习任我行】第二阶段个人总结10
  • 原文地址:https://www.cnblogs.com/yingying0907/p/2624975.html
Copyright © 2011-2022 走看看