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()函数给了对象一个初始状态,这样一个初始状态对于后续的操作是意义重大的
(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个字节,栈上的空间指向堆空间,堆上的空间指向茫茫的内存,因此也是不可以的
情形三
此时会发生泄漏,申请从外到内,释放从外到内
如果用构造器和析构器
内存的申请和释放都放在构造器和析构器中
这种方式是内存管理层次分明,只对本层的内存负责
构造析构是很分明的
- C++较C语言,解决了由外而内的申请,由内而外释放,而是只对本层级负责,内部的层级由内部本层级来负责
C++基础知识--DAY3的更多相关文章
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- RabbitMQ基础知识
RabbitMQ基础知识 一.背景 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然 ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- selenium自动化基础知识
什么是自动化测试? 自动化测试分为:功能自动化和性能自动化 功能自动化即使用计算机通过编码的方式来替代手工测试,完成一些重复性比较高的测试,解放测试人员的测试压力.同时,如果系统有不份模块更改后,只要 ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(二) - 查询基础
SQL 基础知识梳理(二) - 查询基础 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5904824.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
- [SQL] SQL 基础知识梳理(四) - 数据更新
SQL 基础知识梳理(四) - 数据更新 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5929786.html 序 这是<SQL 基础知识梳理( ...
- [SQL] SQL 基础知识梳理(五) - 复杂查询
SQL 基础知识梳理(五) - 复杂查询 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5939796.html 序 这是<SQL 基础知识梳理( ...
随机推荐
- DELPHI中MDI子窗口的关闭和打开
DELPHI中MDI子窗口的关闭 和打开 Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会 发觉该子窗口只是最小化,而不是你预期的那样被 ...
- SQL Server 2008 开启远程连接
除了 IP1.IP2 外,也要把 IPALL 的端口也设置为 1433 参考:SQL Server开启1433端口,彻底解决方案
- Military Problem CodeForces 1006E (dfs序)
J - Military Problem CodeForces - 1006E 就是一道dfs序的问题 给定一个树, 然后有q次询问. 每次给出u,k, 求以u为根的子树经过深搜的第k个儿子,如果一个 ...
- hdu-1421(dp)
解题思路:dp[i][j]表示前i个物品中取k对所要的最小花费: 首先得对物品进行处理,因为需要当前物品减前一个物品的平方和最小: 所以先排序,因为排序的相邻两个的差的平方一定最小: 然后转移方程:d ...
- Wiener Filter
假设分别有两个WSS process:$x[n]$,$y[n]$,这两个process之间存在某种关系,并且我们也了解这种关系.现在我们手头上有process $x[n]$,目的是要设计一个LTI系统 ...
- Number Sequence POJ - 1019 递推 数学
题意 1 12 123 1234 12345 ....这样的序列 问第n位数字是几 是数字! 1-9! 思路:递推关系 主要是位数的计算 用a[i]=a[i-1]+(int)log10((do ...
- IDEA如何查看maven的依赖结构
打开方式: 方法一:该工具有个Maven Projects窗口,一般在右侧能够找到,如果没有可以从菜单栏打开:View>Tool Windows>Maven Projects:选择要分析的 ...
- MT【259】2016天津压轴题之最佳逼近
(2016天津压轴题)设函数$f(x)=(x-1)^3-ax-b,x\in R$, 其中$a,b\in R$(1)求$f(x)$的单调区间.(2)若$f(x)$存在极值点$x_0$,且$f(x_1)= ...
- Nginx 添加 PHP 支持
背景介绍默认安装的Nginx是无法打开php文件的,需要修改相关配置才能支持php 安装yum -y install epel-release yum -y install nginx yum ins ...
- Hdoj 1232.畅通工程 题解
Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通 ...