c到c++过度 第二天笔记
本帖最后由 代号3 于 2018-4-30 15:14 编辑类的基本使用
定义方式
成员意义
对象意义
类的内部组成
构造函数
特殊构造函数
析构函数
编程方式区别
面向过程:
确定项目功能→功能分解→函数实现→功能组装(函数组装调用)
自下而上的编程方式
程序=算法+数据结构
面向对象:
确定程序流程→功能设为对象→假设对象提供自身的操作方法→在流程框架中调用对象的方法
完成项目
程序=对象+对象+对象+对象间的交互
对象=算法+数据封装好后 外部的变化不会影响对象内部
三大特性:封装 继承 多态
封装是基础 继承是关键 多态是补充
类的概念
类是结构体的改进同类对象抽象出的共性
类是将 不同类型的数据 和 与这些数据相关的操作 封装 在一起的 集合体
类中可以定义函数 参数编译器自动补
补充 对象:把一系列数据和处理数据的过程方法封当成一个整体,此封装体叫做对象
访问一般对象的成员:
<对象名>.<数据成员名>
<对象名>.<成员函数名>(<参数表>)
访问指向对象的指针的成员:
<对象名>-><数据成员>
<对象名>-><成员函数名>(<参数表>)
对象生存期与作用域:
局部对象:定义在一个函数体内或程序块内,作用域和生存周期局部
全局对象:定义在某个文件中,作用域为包含该文件的整个程序,生存周期全局
静态对象:生存周期全局
内部静态对象:作用域为定义它的函数体和程序块内
外部静态对象:定义它的文件
类是对现实世界中的客观事物的抽象,将具有相同属性的一类事物称作类
类是创建对象的样板,包含所创建对象的状态描述(数据)和方法的定义(成员函数)。对象是特定的类
创建的,某个类所创建的对象也就是这个类的实例。
类的定义
声明部分
数据成员声明
成员函数声明
实现部分
成员函数实现
访问控制符(出现顺序和次数无限制) 实现封装性访问:能够使用数据或能调用函数
public 提供类的接口功能 不仅可以被成员函数访问还可以在程序中访问
private 成员是被类隐藏的数据,只有该类成员才可以访问,类外部无法访问派生类的函数也无法
访问
protected 成员外部无法访问 派生类函数可以访问
定义一个一个类之后才能在程序中定义类的对象
class 类名 可以有空类(隐式6成员 总大小1字节)
{ 具体P34课本
public:
公有数据及成员函数;
private:
私有数据及成员函数;(使用return来实现调用 get set 成员函数)
protected:
受保护的成员函数及数据;
}
命名约定
'm_' 后跟变量名默认是私有类型数据
类中定义的函数被称为成员函数
特性:
成员函数可以访问类中的所有成员(变量和函数)
声明和实现
直接在类内实现成员函数
在类内声明 在类外定义
void 类名::函数名() 函数名前加作用域
类内声明 类外定义(其他文件的类外)
头文件包含
void 类名::函数名()
常用方式
类中的成员以及成员的使用
成员变量
1·类的外部,通过访问类对象访问
2·成员函数中,直接使用成员变量的名字
成员函数
1·类的外部,通过访问类对象访问
成员函数和命名空间中定义的函数不一样 不是通过作用域就可以访问
2·类的内部 直接使用函数名
const加在在成员函数后面 表示成员的内部不能修改成员变量的值 不能调用没有加const的成员函数
访问控制
public 公有属性 可以在类的外部通过对象来访问
private 私有属性 只能在类的成员函数中访问 类的外部无法访问
protected 保护 只能在类的成员函数中访问 类的外部无法访问
this指针
可以访问类中的所有成员
具有一个隐含的形参 本类类型 *this
void printf(/*类名*this*/)
this->成员名=参量;
this是一个指针 指向调用成员函数对象的地址 ?野指针是否出现?成员函数生存周期
//this与对象密切 析构函数会释放 不会有野指针
类的作用域简称类域 类域范围指的是在类所定义的类体中,该类的成员局部于该类所属的类域
类作用:对一个类的数据成员和成员函数受到程序保护
可见性
类名允许与其他变量名或函数名同名
类名被隐藏 加前缀class
类名隐藏了变量通过作用域符号‘::’访问
类的封装
默认私有
定义一个类就是定义了一组数据和操作数据的函数
类中一些成员是保护的,被有效的屏蔽防止外界干扰和误操作
c++中类与结构体的区别
默认访问区别不同
类增加了定义函数的特性
构造函数 创建对象目的 初始化!
特性 初始化列表 按照成员变量声明来初始化不是按照初始化列表顺序 ?默认参量//可
定义变量时需要初始化
通过类类型创建的变量叫做对象,对象的初始化由类的构造函数完成 对象的内存由构造函数分配
类没有构造函数不能定义对象(无内存 无初始化)
构造函数无返回值 默认是类对象
函数名和类名一样
对象被创建 自动被调用
函数名同类名 函数原型没有返回值类型
函数返回值可以有参数 可以构成函数重载 可以有默认值
new可以为构造函数分配内存并调用构造函数
malloc可以分配堆内存但无法访问对象不能调用构造函数
析构函数 销毁对象
对象生存周期结束 用于释放内存 自动调用
在构造函数名前加‘~’
无参数 不能重载 只有一种固定写法
析构函数析构对象时注意
占用了资源(打开了文件)在析构函数中统一释放(关闭文件)
构造析构的执行顺序
先构造
后析构
特殊构造函数
默认构造
特征 无参数
调用时机
构造对象不传参的时候 只负责构造空间 不初始化
函数传参 函数返回值也可能会调用 ?时机 2次构造// 调默传转
转换构造
特征 参数只有一个 参数类型非本类类型(如果没有相对应成员声明会报错:无此类型)
隐式转换问题
规则:若目标转换两边类型为基本类型 多数成功
若目标类型为类类型 编译器尝试找到类中转换构造函数 构造一个对象再将此对象赋值目标
调用时机
间接被编译器调用 发生了隐式转换即实参类型与形参类型不一致的时候
显式调用转换构造
可能影响程序运行效率(隐式转换)
explicit(关键字) :禁用编译器的隐式转换 ?作用域 生存期
强制类型转换 //整个程序禁用
(类型)量
类型(量)
匿名对象
返回对象 临时存在 2次销毁 第一次销毁形参 第二次销毁匿名对象返回值
不可修改接受需要加const在接受的形参前
技巧 类名& 参量名
对象名.参量名 查看使用的对象
拷贝构造 将一个对象的内容拷贝给另一个对象 对象间操作 不涉及实参值
特征 参数只有一个 参数类型必须是本类类型的引用
调用时机
定义类对象时 使用另一个类对象来初始化
前边加const 保护类型不变
类名()=default;保留默认构造函数 以备调用
深拷贝 空间浪费问题(解决:浅拷贝基础上引入共用对象概念 使用引用计数(拷入+1析构-1)
计数为0销毁申请的额外空间 写时拷贝技术控制空间申请)
自行构建的拷贝函数 申请等大的堆空间
拷贝指针所指内容
浅拷贝
默认拷贝构造函数 简单地址对应拷贝 会造成某个销毁后另一个仍然调用的内存出错
只拷贝指针地址
带参构造
特征 参数个数两个及以上 参数类型无要求
调用时机
非上述三个函数 eg:多个字符串拼接问题
类的使用
头文件 string无.h
eg:stringstrObj;字符串类对象
strObj=“123”;
strObj+=“78”;
strObj=string("")+"hello"+"world”;
if(strObj=="hello”)
{}
字符串追加
MyString &append(const char *pStr)
{
public:
MyString(){
m_buff=0;
}
MyString str;
str.append("23").append("789");
}
成员指向的空间需要手动销毁问题
排序和编辑模式不同 传一份原件 C++ 怎么下载 求帮助
国服鲁班七号 发表于 2018-6-21 23:15
C++ 怎么下载 求帮助
你所指的是编译器么 我用的是VS2015 你需要我可以云盘给你一份儿vs2013的
页:
[1]