• C++基础知识--DAY3


     今天我们开始进入封装类的地方

    Encapsulation(封装)

    (1)  C struct数据封装

    当单一变量无法完成描述需求的时候,结构体类型解决了这一问题,可以将多个类型打包成一体,形成新的类型,这是C语言的封装的概念,但是新类型并不包含对数据类的操作,所有的行为都是通过传参的方式进行操作

    (2)  封装,包含两个部分,一部分数据,一部分行为(接口)

    对外提供接口,隐藏数据,对内数据开放

    (3)  struct中所有行为和属性都是public的(默认),C++中class可以指定行为和属性的访问方式,默认全部都是private

    访问属性

    属性

    对象内部

    对象外部

    Public

    共有

    可访问

    可访问

    private

    私有

    可访问

    不可访问

    (4)   为了提高核心竞争力,我们在实际使用过程中在class里面只放函数声明,并且会只提供头文件给对方,那么就需要在程序中添加一个类,将类的声明写在.h文件中,一般来说,声明都应该放在.h文件中

     

    此外,在添加的.cpp文件中写出函数的实现

     

    在主程序中像struct类一样

     

    (5)  在累歪定义成员函数,为了实现xxx.h和xxx.cpp,不能把它定义成全局,利用类名::进行限定

    (6)  ::这个操作符只在命名空间里面用过,说明类名本质也是一个命名空间

     

    利用这种方式可以说明类名和命名空间的用法是一样的,因此可以实现

    3. 链表类操作

    在C++中也可以用链表进行操作,但是常将其实现写在另一个文件中,因此我们实现链表的操作时,将类的声明写在mylist.h文件中,将函数的实现写在mylist.h中,并且在函数的实现时需要将函数的类进行声明

    (1)类的声明写在mylist.h文件中

    (2)函数的实现写在mylist.cpp文件中

    (3)main函数直接对其进行调用

    4. 正式过度到class(类)

    (1)init到自动化

    前面我们封装Date/Stack/List,虽然表达的意义各不相同,但均会涉及到初始化,即init()函数

    init()函数给了对象一个初始状态,这样一个初始状态对于后续的操作是意义重大的

    在类外定义成员函数,为了实现xxx.h和xxx.cpp,不能把它定义成全局,类名::进行限定

    ::之前在命名空间上用过,实际上,类名也是一种命名空间

    (2)构造器

    在我们进行初始化的时候,常常用的操作是

    但是每次都需要调用init()函数很麻烦,因此C++中引入了构造器(constructor),其不能单纯的理解为函数,我们将其理解为一种构造机制

     构造器特点:

    a. 与类名相同,在对象生成的时候自动调用

    如图,最终会输出x和y,因此在正常情况下,就会不用写init()函数了

    b. 无返回值,可以有参数,

    这个是有问题的,不够灵活,比如说本来只需要10个字节,其会提供1024个,若本来需要1025个空间,其也只能提供1024个空间,因此就需要用到其可以有参数的规则

    这样的话,默认参数就是1024

    c. 构造器可以有默认参数,可以被重载->都是有有参数所造成的

    d. 系统提供默认的无参空体构造器,一经自实现,系统提供的默认不复存在,无论重载,还是默认参数,应该把无参空体构造器包含进来

    e. 生成无参的对象,是一种比较常见的现象,对象数组

    (3)关于默认

    无论通过重载还是默认参数的构造器,一经实现,默认的无参构造器不复存在,默认无参构造器,常作为生成对象的一种标配存在,所以我们在实现重载或默认参数构造的时候,将默认无参构造函数纳入其中

    (4)初始化列表(initial list)

    C++提供了一种不在构造体内初始化的方法,成为初始化列表,一方面提升了效率,另一方面是功能的扩展

    在初始化列表中主要完成初始化,比如刚刚我们定义的

    原始的构造器的写法:

     

    后来的列表初始化写法

     

    实际上,列表初始化主要是完成对private变量中的初始化

     

    主要是完成对数据成员的初始化,效率很高

    初始化列表中的初始化顺序,和列表中的顺序无关

    (5)此列表中不要拿被初始化的成员去初始化其他

    析构器->实际上系统给我们提供了一个自动调用的概念

    析构器是与类同名的,无参,无返回,前面加一个~在对象被销毁前,自动调用,被调用用来处理清理工作(主要是针对堆对象)

    对象被销毁有两种:栈上的对象被销毁和堆上的对象被销毁,相当于destroyList()的功能

    c. 系统提供默认空析构器,已经实现,不复存在

    (1)  析构器是不是必须的

    在没有堆对象的空间中,使用默认的就好,在对象有对空间的情形下,是必须要用的

    (2)  析构器在什么时候调用

    析构器自动调用,在对象销毁时调用

    6. 层次内存管理(Theory of)

    实际上在我们赋值的过程中,这里有几种常见的情况是不允许的

    情形一:

     

    实际上在这里是不可以的,因为并没有指定”xiaoming”是在那个字节空间里的

    情形二:

     

    在这里实际上是首先是在栈上申请了4个字节,在堆上申请了8个字节,栈上的空间指向堆空间,堆上的空间指向茫茫的内存,因此也是不可以的

    情形三

     

    此时会发生泄漏,申请从外到内,释放从外到内

    如果用构造器和析构器

     

    内存的申请和释放都放在构造器和析构器中

    这种方式是内存管理层次分明,只对本层的内存负责

     

    构造析构是很分明的

    1. C++较C语言,解决了由外而内的申请,由内而外释放,而是只对本层级负责,内部的层级由内部本层级来负责
  • 相关阅读:
    FirstApp,iphone开发学习总结10,归档(序列化、固化)
    FirstApp,iphone开发学习总结9,旋转
    iphone开发学习,开源之UIAlertViewBlocks
    FirstApp,iphone开发学习总结13,方向感应和通告
    iphone开发学习,开源之Three20
    FirstApp,iphone开发学习总结11,表操作(移动、删除)
    FirstApp,iphone开发学习总结12,播放音乐、视频
    iphone开发学习,开源,ASIHTTPRequest的学习
    iphone开发学习,开源之SVWebViewController,UIWebView支持后退、前进、刷新、使用Safari打开
    iphone开发学习,Block
  • 原文地址:https://www.cnblogs.com/Cucucudeblog/p/10055372.html
Copyright © 2020-2023  润新知