类和对象

类和对象
类的基本思想是数据抽象和封装。抽象数据类型由一组数据和对这些数据的操作组成。
结构体内的函数被称为成员函数,结构体中的数据则被称为数据成员。扩展的结构体被称为类,结构体类型的变量被称为对象。
没有初始值的成员将被默认初始化
类定义中声明的数据成员和成员函数都具有类作用域
成员函数定义虽处于类定义的花括号外,但还是在类作用域内,不需要成员访问语法。
在类定义的花括号内定义的成员函数默认为inline函数
访问控制和封装
通过限定成员的访问权限来实现信息隐藏
关键字public,private和protected被称为访问限定符
访问限定符在类定义中出现顺序和出现次数没有限制
一个访问限定符的作用会持续到出现下一个访问限定符或类定义结束
如果没有指定访问限定符,struct成员的默认访问限制为public
protected成员可以由类自己的成员函数,友元,派生类成员访问
对象是数据和操作的封装体
对象是客观事物的抽象,类是一组具有相同属性和行为的对象的抽象,对象又称为类的实例
外部程序通过类接口中提供的操作访问对象的数据,这成为向对象发送消息。
同一个类的每个实例都有自己独立的数据,但是可以接收相同的消息。
对象能够持有的数据和接收的消息由它们所属的类决定,类设计是面向对象编程的核心。
如果class的成员没有设置访问限定符,则默认为private
简单对象在内存中占据的存储空间是所有数据成员大小的和。但是如果为了访问效率而采用边界对齐的话,对象的大小是机器字长的整数倍。
对象在内存中的布局是依赖于特定编译器实现的,一般情况下,一个访问限定符所限定的一组数据成员在内存中是连续存储的
不同的访问块本身不一定按照声明的顺序存储
每个成员函数都有一个隐含的参数,指向接收消息的对象,称为this指针。this指针是一个常量,含有当前实施调用的对象的地址。
this指针在成员函数中的用途
区分与数据成员同名的变量
返回当前对象
取得当前对象地址
构造函数和析构函数
对象合理初始化的重要性
程序中,对象实质上就是一块存储区,在这块存储区中存放数据,并且隐含着对这些数据进行处理的操作,在创建对象时,这块存储区应该被合理地初始化。
构造函数在创建对象时被自动调用,负责初始化对象。构造函数的名字和类名字相同,它没有返回类型。构造函数的参数通常为数据成员提供初始值
构造函数可以重载
构造函数的形式决定了初始化对象的方式。如果成员是const,引用,或者是未使用默认构造函数的类类型,就必须通过构造函数初始化列表提供初值
在初始化列表中,每个成员只能出现一次。成员初始化的顺序与他们在定义中出现的顺序一致
委托构造函数使用所属类的其他构造函数执行自己的初始化过程,把部分或全部职责委托给了其他构造函数。
通常无参数或参数少的构造函数将自己的初始化职责托给参数多的函数,或者比较特殊的构造函数委托更通用的构造函在对象生存期间,够生存期结束时,应返回或释放相关资源造函数或其他成员函数可能为对象分配某些资源
当对象
析构函数负责在对象生存期结束时返回相关资源和自动释放资源
当对象离开作用域时,或者用delete释放在堆上创建的对象时,析构函数都会被自动调用,析构函数没有返回类型和参数,不能重载,只能为一个类定义唯一一个析构函数
析构函数主要被用来放弃在类对象的构造函数或生存期中获得的资源
如果类中没有定义析构函数,编译器在需要时会自动合成一个析构函数
const可以限定类中的数据成员,描述对象中的常量
创建对象时初始化其中的const数据成员,之后const成员的值在对象的整个生存期中都不会改变
试图修改const对象的操作会引起编译错误,将一个成员函数声明为const,表明这个成员函数不会修改对象的数据成员,能保证对象的常量对于在类外定义的const成员函数,必须在它的定义和声明中同时指定关键字const
只有声明为const的成员函数才可以被const的对象调用
const成员函数的定义和调用规则
如果成员函数是非const的,则只有非const对象可以调用它,const对象不能调用非const的成员函数
如果成员函数是const的,则const对象可以调用它,非const对象也可以调用它 不会改变对象中的成员
允许为成员函数定义const和非const两个版本,这两个版本是重载函数
在这种情况下,对const对象,会选择调用const版本的成员函数,对非const对象,则调用非const成员函数
static数据成员被当作该类类型的全局变量
对非static数据成员,每个对象都有自己的副本
static数据成员对整个类类型只有一个,由这个类型的所有对象共享访问
与全局变量相比,static数据成员没有进入成员的全局作用域,只是在类作用域中,不会与全局域中的其他名字产生冲突
static数据成员仍然遵循访问控制规则,可以实现信息隐藏
static数据成员属于类,不属于某个特定对象因而不能在构造函数中初始化
static成员只能定义一次,定义一般不放在头文件中,而是放在包含函数定义的源文件中
static数据成员仍然遵循访问控制的约束
一般要通过成员函数来访问数据成员
成员函数也可以访问static数据成员,普通成员函数必须通过类的对象或指针调用,而静态数据成员并不依赖对象存在
static成员函数中不能访问非static数据成员,也不能调用非static成员函数
类内部的成员是没有地址的,只有把成员在类中的偏移和具体对象的起始地址结合在一起才能得到实际的地址。
指定指针指向的类型,说明它指向的是哪个类的成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值