类和对象(1)

类的构造

class为定义类的关键字,stack为类的名字,{}中的为主体
类体中内容称为类的成员; 类中的变量称为类的属性或成员变量; 类中的函数被称为类的方法或成员函数
class stack
{

}; // ; 不能省略

为了区分成员变量, 一遍习惯对成员变量加上一个特殊标识 ,如成员变量前面或后面加_ 或者m开头
*(在c++中这个要求不强制,至少惯例)

c++中struct也可以定义类, c++兼容c中struct的用法 , 同时struct升级成了类
(在c++中struct里也可以定义函数)
但还是推荐用class
定义在类里的成员函数默认为inline

访问限定符

c++中一种实现封装的方式, 用类将对象的属性与方法结合在一起, 让对象更加完善 通过访问权限选择性的将其接口提供给外部用户使用
public修饰的成员可以在类外直接被访问

protected和private修饰的成员在类外不能直接被访问
(目前protected和private一样)
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符为止,如果后面没有访问限定符,作用域就到 } 结束
class定义的成员默认为private
struct默认为public

类域

类定义了一个新的作用域, 类的所有成员都在类的作用域中, 在类体外定义成员时,需要用 ::作用域操作符指明成员属于哪个类域
类域影响的是编译的查找规则, 如果不指定对应类域 , 则在使用域中的函数时,编译器会将其当成全局函数而不是成员函数就报错
用 :: 指定域后调用函数时如果全局中没有该函数则会去类中找

对象大小

对象中不需要储存指针,成员函数的指针都是一样的 ,再额外储存就太浪费了
函数指针不需要储存,函数指针是一个地址,编译器在编译链接时,就要找函数的地址,不是在运行的时候找

this指针

编译器在编译后,类的成员函数会默认在形参第一个位置,增加一个当前类类型的指针,叫做this指针
如Data类的init函数 void init(Data* const this, int year, int month, int day)

类的成员函数中访问成员变量,本质都是通过this指针访问的
如 this->_year =year

c++规定不能在实参和形参的位置显示的写this指针 ,但可以在函数体内显示的使用this指针

c++和c语言实现stack对比

面向对象三大特性 : 封装, 继承, 多态
c++中数据和函数都放到了类里面, 通过访问限定符进行了限制, 不能再随意通过对象直接修改数据
这是c++封装的一钟体现
c++中有一些相对方便的语法, 比如init给的缺省参数会方便很多, 成员函数每次不需要传对象地址,因为this指针隐含的传递了
使用类型不再需要typedef重命名

类的默认成员函数

默认成员函数就是用户没有显示实现, 编译器会自动生成的成员函数称为默认成员函数
一个类,我们不写的情况下编译器会默认生成一下6个默认成员函数, 需要主要前四个比较重要

初始化和清理 :

构造函数
析构函数

拷贝复制 :

拷贝构造
赋值重载

取地址重载:

主要是普通对象和const对象取地址

构造函数

构造函数是特殊的成员函数, 构造函数的主要任务是对向实例化时初始化对象. 构造函数的本质是要代替以前的init函数
1 函数名与类名相同
2 无返回值(void也不用写)
3 对象实例化时系统会自动调用对应的构造函数
4 构造函数可以重载

5 如果类中没有显式定义的构造函数, 则c++编译器会自动生成一个无参的默认构造函数, 一但用户定义, 编译器将不再生成

6 无参构造函数, 全缺省构造函数. 不写构造函数时编译器默认生成的构造函数叫 默认构造函数. 但这三个函数有且只有一个存在,不能同时存在无参构造函数和全缺省构造函数虽然构成重载,但调用时会存在歧义
(总结: 不传实参就可以调用的构造叫做默认构造)

7编译器默认生成的构造,对内置类型成员变量的初始化没有要求, 也就是说是否初始化不确定,要看编译器

*对于自定义成员变量,要求调用这个成员变量的默认构造函数初始化,如果这个成员变量没有默认构造函数,则会报错

  • c++把类型分成内置类型和自定义类型. 内置类型就是语言提供的原生数据类型 如:int/char/double 指针等
    自定义类型就是我们使用的struct/class等关键字定义的类型

析构函数

析构函数与构造函数功能相反, 析构函数不是完成对对象本身的销毁, c++规定对象在销毁时会自动调用析构函数完成对象资源的清理释放工作
析构函数对于没有资源需要释放的情况是不需要的
1 析构函数名是在类名前面加上字符~
2 无参数无返回值 (也不用加void)
3 一个类只能有一个析构函数,若未显式定义, 系统会自动生成默认的析构函数
4 对象生命周期结束时,系统对自动调用析构函数
5 编译器自动生成的析构函数对内置类型成员不做处理 ,自定义类型成员会调用他的析构函数
6 我们显式写析构函数,对于自定义类型成员,也会调用他的析构, 也就是说自定义类型成员无论什么情况都会自动调用析构函数
7 如果类中没有申请资源,析构函数可以不写, 直接使用编译器生成的默认析构函数
但有资源申请时一定要自己写析构

复制运算符重载

当运算符被用于类类型的对象时, c++语言允许我们通过运算符重载的形式指定新的含义
c++规定类类型对象使用运算符时, 必须转换成调用对应运算符重载, 若没有对应的运算符重载,则会编译报错

运算符重载的具有特殊名字的函数, 名字是由operator和后面要定义的运算符共同构成.
和其他函数一样,他也有返回类型和参数列表以及函数体

重载运算符函数的参数个数和该运算符作用的运算对象数量一样多, 一元运算符有一个参数,二元运算符有两个参数,
二元运算符的左侧运算对象传给第一个参数, 右侧运算对象传给第二个参数

如果一个重载运算符函数是成员函数, 则他的第一个形参对象默认传给隐式的this指针, 因此运算符重载做为成员时,参数比运算对象少一个

运算符重载后,优先级和结合性与对应的内置类型运算符保持一致
不能通过链接语法中没有的符号来创建新的操作符 如operator@

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值