类和对象

  1. this指针
  2. 构造函数
  3. 析构函数
  4. 运算符重载
  5. 友元函数

这里写图片描述
编译器又是如何识别类呢?
1)首先识别类的类名  2)识别类的成员变量
3)识别类的成员函数并对类的成员函数进行修改(将当前对象的地址(this指针)传给函数)

this指针

this指针的特性

1)this指针的类型:类类型* const
2)this指针不是对象的一部分,不影响sizeof的结果
3)其作用域在非静态成员函数的内部
4)this指针是非静态成员函数的第一个默认隐含参数,编译器自动维护传递,
 类编写者不能显示传递
5)只有在类的非静态成员函数才能使用this指针

如果参数个数确定,this指针通过ECX寄存器传给被调用者;如果参数不确定,this指针在所有参数被压栈后压入堆栈。

构造函数

  构造函数是一个特殊的成员函数,名字与类名相同。创建类类型对象时由编译器自动调用,在对象的生命周期内只能调用一次,保证每个数据成员都有一个合适的初值。
  构造函数的特性

1.函数名于类名相同

2.没有返回值

3.新对象被创建是,由编译器自动调用,且在对象声明周期内仅调用一次

4.构造函数可以重载,实参决定刻调用那个构造函数

5.无参构造函数和全缺省的构造函数都认为是缺省的构造函数,并且缺省的构造函数
  只能有一个

6.有初始化列表(可以不用)

7.如果没有显示定义时,编译器会合成一个默认的构造函数。

8.构造函数不能用const修饰

9.构造函数不能为虚函数    

3.类中包含以下成员,一定要放在初始化列表位置进行初始化:

引用成员函数

const成员变量

类类型成员(该类有费缺省的构造函数)

4.构造函数的作用

1.构造 初始化对象

2.类型转换

    对于单个参数构造函数,可以将其接受参数转化成类类型的对象。用
    explicit修饰构造函数,抑制由构造函数定义的隐式转换,explicit
    关键字类内部的构造声明上,在类的定义体外部的定义不在重

析构函数

  与构造函数功能相反,在对象被销毁时,由编译器调用,完成类的一些资源
清理工作和汕尾工作。
   析构函数的特性
  1.析构函数在类名加上字符
  2.析构函数无参数无返回值
  3.一个类有且只有一个析构函数。若未显示系统会自动生成缺省的析构函数
  4. 对象声明周期结束,C++编译器系统自动调用析构函数
  5. 注意析构函数体内并不是删除对象,而是做清理工作。

友元

友元分为:友元函数和友元类

友元函数:可以直接访问累的私有成员,他是定义在累外部的普通函数,不属于任何类
但需要在类的内部声明,声明时需要加上friend关键字
友元函数特性
1)友元函数可访问类的私有成员,但不是类的成员函数

2)友元函数不能用const修饰

3)友元函数可以在类定义的任何地方声明,不受访问限定符限制(不能放到成员函数的定义里)
4)一个函数可以是多个类的友元函数

5)友元函数的调用于普通函数的调用和原理相同

友元类:友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
如A类要访问B类的非公有成员,在B类里声明一下A是B的友元类(fread class A)

友元类的优缺点
  优点:提高了程序的运行效率
  缺点:破坏了类的封装性和隐藏性

注意
  
  友元关系不能继承
  友元关系是单向的,不具有交换性
  友元关系不能传递

运算符重载

概念:重载操作符是具有特殊函数名的函数,关键字operator后面接需要定义的
  操作符符号。操作符重载也是一个函数,具有返回值和形参表。它的形参
  数目与操作符的操作数目相同,使用运算符重载可以提高代码的可读性
  返回值 operator 操作符(参数列表)

不可以重载的运算符:
  1)成员选择符 ‘ . ’
  2)成员对象选择符 ‘ .* ’
  3)域解析操作符 ‘ :: ’
  4)条件操作符 ‘ ?: ’

2.特性:

1.不能通过连接其他符号来创建新的操作符:比如operator@

2.重载操作符必须有一个类类型或者枚举类型的操作数

3.用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不
  能改变其含义

4.作为类成员的重载函数,其形参看起来比操作数数目少1成员函数的操作符有一个
  默认的形参this,限定为第一个形参

5.一般将算术操作符定义为非成员函数,将赋值运算符定义成员函数。因为算术操作符需要两个操作 数,在类内我们只用给一个参数,在类外需要两个参数,用意较明显

6.操作符定义为非类的成员函数时,一般将其定义为类的友元

7.== 和 != 操作符一般要成对重载

8.下标操作符[]:一个非const成员并返回引用,一个是const成员并返回引用

9.解引用操作符*和->操作符,不显示任何参数

10.前置式++/–必须返回被增量或者减量的引用,后缀式操作符必须返
   回旧值,并且应该是值返回而不是引用返回(后置++后面一定有参数)

11.输入操作符>>和输出操作符<<必须定义为类的友元函数(不放在类内,类成员函数有隐藏的this指针)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值