类和对象

1. 面对对象的思想

类模拟的是现实生活中的抽象数据类型,对象模拟的是现实生活中的实体。类转换为对象的过程叫实例化。

  1. 从世界观的角度可以认为:面向对象的基本哲学是认为世界是由各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。这样建立起来的系统才能符合现实世界的本来面目。
  2. 从方法学的角度可以认为:面向对象的方法是面向对象的世界观在开发方法中的直接运用。它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。

2. 封装的思想

封装是将事物的一些不便暴露给外界的一些属性隐藏起来。同时给外界提供一些接口,用来和外界进行交互,建立连接关系。
如何实现封装?
加访问限定符:设置起到下一个访问限定符或者类结束。

访问限定符访问权限
public任意访问
protected子类和本类中
private本类中

3. const的用法

  1. C中的const:

const修饰的变量叫常变量,编译阶段:判断常变量有没有作左值。即不允许直接或间接修改。其他处理与变量相同。
4. ### C++中的const:
1、常量不允许修改,无论是直接还是间接。
2、常量一定要初始化。
编译阶段直接将用到常量的地方替换成常量初始化的值。
不可以取消常变量的常属性,即只允许缩小权限(加const),不允许扩大权限。const修饰看右边。

const int a = 10;
int *p = &a;//不对
//杜绝间接访问常量内存的危险。

4. static的用法

  1. static修饰变量:

静态数据成员,对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。 对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。
1、静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。
2、静态数据成员和普通数据成员一样遵从public,protected,private访问规则;
3、因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它;
4、静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:<数据类型><类名>::<静态数据成员名>=<值>
5、类的静态数据成员两种访问形式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
静态数据成员主要用在各个对象都有相同的某项属性的时候。
静态数据成员同全局变量的优势:
1、静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;
2、静态数据成员可以是private成员,而全局变量不能。可以实现信息隐藏。
6. ### static修饰函数:
静态成员函数,它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员一样,都是类的内部实现,属于类定义的一部分。普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身, 因为普通成员函数总是具体的属于某个类的具体对象的。通常情况下,this是缺省的。但是与普通函数相比,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针。
静态成员函数的特点:
7. 静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
8. 非静态成员函数可以任意地访问静态成员函数和静态数据成员;
9. 静态成员函数不能访问非静态成员函数和非静态数据成员;
10. 由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;
11. 调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:<类名>::<静态成员函数名>(<参数表>)。

5. 类中的几个默认函数及其特点

构造函数

对象生成的两步:1、开辟对象所占的内存
2、调用构造函数初始化对象所在的内存
构造函数的函数名等于类名,作用是给开辟的内存初始化。构造函数无法手动调用,只能系统调用。若用户提供构造函数,则系统不提供,若没有,则使用系统的构造函数,所以,构造函数可以重载。

析构函数

对象销毁的两步:1、调用析构函数(释放对象所占的其他资源)
2、释放对象所占的空间
构造函数:函数名 = ~类名
作用是释放对象所占的其他资源,析构函数可以手动调用,手动调用则退化为普通函数调用,之后系统还会再调用一次。
析构函数可以自己写,也可以系统提供,但析构函数不支持重载

构造函数析构函数
存在this指针存在this指针
能重载不能重载
只能系统调用既能系统调用,也可人为调用

拷贝构造函数

函数名 = 类名
作用:用一个已存在的对象来生成一个相同类型的对象。
默认的构造函数是浅拷贝,只是实现了简单的数值的拷贝,若有指针类型存在,会造成两个对象的指针指向同一个内存块,导致同一个内存块重复释放,结果出错。若类中有指针类型,则考虑实现深拷贝,使每个指针都指向各自的内存块,再进行拷贝赋值,避免内存的重复释放。
有 &引用符号时,引用只是给对象起别名,不会生成新的对象。

赋值运算符的重载函数

函数名 = operator=
作用是拿一个已存在的对象给另一个已存在的对象赋值。
默认的赋值函数,不能操作指针,会导致两个对象的指针都指向同一个内存块,这个时候就需要自己写一个赋值运算符函数。
赋值运算符重载的四步:
1、自赋值判断(判断是否自己给自己赋值)
2、释放旧资源
3、开辟新资源
4、赋值
赋值运算符的重载函数的形参的&不是必须的,没有的话会生成一个临时对象,多了两个函数的调用:构造、析构。有的话不会生成临时对象,免去这过程,更高效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值