C++ primer 类

类定义了数据成员和函数成员,数据成员用于存储与该类型的对象相关联的状态,而函数成员则负责赋予数据意义的操作

类的定义和声明
类就是定义了一个新的类型和新作用域
每个类可以没有成员,也可以定义多个成员,成员可以是数据,函数或类型别名
在public中定义的成员可以被使用该类型的所有代码访问,在private部分定义的成员可被其他类成员访问
所有的成员都必须在类内部声明,一旦类定义完成,就没有任何方式增加成员了
在类内部,声明成员函数时必须的,类内定义的函数默认为 inline,类外定义的成员函数,必须指明他们是在类的作用域中
将关键字 const 加在形参表之后,就可以将成员函数声明为常量:
double avg_price() const;
const成员不能改变其所操作的对象的数据成员,const 必须同时出现在声明和定义中。

数据抽象和封装
数据抽象是一种依赖于接口和实现分离的编程技术,类设计者关系类如何实现,使用者不必了解这些细节
封装是一项低层次的元素组合起来形成新的高层次实体珠技术

访问标号实施抽象和封装

  • 程序的所有部分都可以访问 public 标号的成员,类型的数据抽象视图由其 public 成员定义
  • 使用类的代码不可以访问带有 private 标号的成员,private 封装了实现的细节

可以在访问标号出现前定义类成员,在类的左花括号和第一个访问标号前定义的类型由 类定义的关键字确定,如果是 struct 关键字定义,则是公有的,如果是 class 关键字,则是私有的

数据抽象和封装的好处:

  • 避免类内部出现无意的,可能破坏对象装态的用户级错误
  • 根据时间的推移可以根据需求改变或缺陷报告来完美类的实现,无需更改用户级代码

    使用类型别名来简化类

typedef std::string::size_type index;

类声明与类定义
一个类只能被定义一次,将类定义在头文件中,可以保证每个使用类的文件以同样的方式定义类
类的定义以分号结束
隐含的 this 指针
成员函数有一个隐含形参,即指向该类对象的一个指针,this,和调用成员函数的对象绑定在一起
什么时候使用 this 指针
需要将一个对象作为整体引用而不是引用对象的一个成员的时
这里写图片描述
这里写图片描述
这里写图片描述
类外定义成员函数,如果返回类型是由类定义的类型,就必须使用完全限定名

类成员声明的名字的查找

  1. 检查在名字出现之前的类成员的名字
  2. 如果第一部不成功,则检查包含类定义的作用域中出现的声明以及类定义之前的声明

类成员定义中的名字的查找
1. 首先检查成员函数内部作用域的声明
2. 后检查对所有类成员的声明
3. 如果还没有,检查此成员函数定义之前的作用域中出现的声明

构造函数
构造函数是特殊的成员函数,只要创建类类型的新对象,都会执行构造函数
构造函数以一个冒号开始,接着是一个逗号分隔的数据成员列表,每个数据成员后面跟一个放在圆括号后的初始化式
这里写图片描述
构造函数分两个阶段执行,初始化阶段,普通的计算阶段。计算阶段由构造函数函数体中的所有语句构成
不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化,初始化发生在计算阶段开始之前
可以初始化 const 对象或引用对象,但不能对他们赋值
必须对任何 const 对象或引用对象, 或者没有默认构造函数的类类型的任何成员使用初始化

默认构造函数
一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数,只有当一个类没有定义构造函数时,编译器才会自动生成一个默认构造函数
内置和复合类型的成员,如指针和数组,只对定义在全局作用域中的对象才初始化。当对象定义在局部作用域中时,内置或复合类型的成员不进行初始化。
如果类包含内置或复合类型的成员,则该类不应该依赖
于合成的默认构造函数。它应该定义自己的构造函数来
初始化这些成员

友元机制允许将一个类将其非公有成员的访问权限授权给指定的函数或类
友元的声明以关键字 friend 开始,只能出现在类定义的内部
通常将友元声明成组的放在类定义的开始或结尾的部分
这里写图片描述
友元可以是普通的非成员函数,或者前面定义的其他类的成员函数或整个类
类必须将重载函数中每一个希望设为友元的函数都声明为友元

static 类成员
全局对象会破坏封装,如果对象是全局的,一般的用户代码就可以修改这个值,类可以定义类 静态成员,而不是定义一个可普遍访问的全局对象
每个static 数据成员是与类关联的对象,但是并不与该类对象相关联
类也可以定义 static 成员函数,static成员函数没有this形参,它可以直接访问所属类的static成员,但是不能直接使用非 static 成员
使用static成员的优点:

  1. static的名字在类的作用域中,可以避免与其他类的成员或全局对象名字冲突
  2. 可以实施封装,static 成员可以是私有成员,而全局对象不可以
  3. static 成员与特定类关联

在成员前加上关键字 static 将成员设为static ,static 符合正常的公有/私有访问规则

使用类的 static 对象
可以通过作用域操作符从类直接调用 static 成员,或者通过对象,引用或指向该类类型对象的指针间接调用

static 成员函数
在类的外部定义static 成员时,无需重复指定static 保留字,该保留字只出现在类定义内部的声明处
static 函数没有this 指针,static 是类的组成部分,但不是任何对象的组成部分
static 数据成员
static 数据成员可以声明为任意类型,可以是常量,引用,数组,类类型等等
static 数据成员必须在类定义体的外部定义,不像普通数据成员,static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。
像使用任意的类成员一样,在类外引用类的static 成员时,必须指定是哪个类,而且 static 关键字只能用于类定义体内部的声明中,定义不能标示为static
static 数据成员不是类对象的组成部分,static 数据成员的类型可以是该成员所属的类类型,非static 成员被限定声明为其自身类对象的指针或者引用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值