C++总结(三) 类和对象、类中默认的函数

一、对象和变量

变量 :开辟内存

对象 :开辟内存+初始化

封装 :将属性和实现细节隐藏起来,对外提供公有的接口进行访问

访问限定符:

Public:任意位置

Protected:本类+子类

private:本类

属性一般私有  行为一般公有

通过公有的行为访问私有的属性  属性一般通过访问限定符

类成员方法的调用约定 :this_call

this指针指向对象的内存空间 访问对象下的成员变量

二、类中默认的函数

没->系统提供  提供->系统不提供

1.构造函数          

初始化对象所占的内存  赋予资源

  • 可以重载 ,实参决定了调用那个构造函数。可以有多个 
  • 函数名与类同名,无返回类型
  • 不能用const来修饰,因为const修饰的是this指针,加上const之后就无法对对象的值进行赋值。
  • 构造函数不能用static修饰,因为静态函数没有this指针
  • 构造不依赖对象调用,即不能手动调用,只能系统调用
  • 新对象被创建,由编译器自动调用,且在对象的生命期内仅调用一次

2.析构函数

释放对象所占资源     <构造、析构都有this指针指向,对象都不完整>

  • 析构函数在类名(即构造函数名)加上字符~。
  • 析构函数无参数无返回值。
  • 一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。
  • 对象生命周期结束时,C++编译系统系统自动调用析构函数。
  • 注意析构函数体内并不是删除对象,而是做一些清理工作。
  • 不可重载  
  • 析构依赖对象,也可以手动调用

析构函数会 退化成普通函数的调用  调用两次? 手动调用 系统调用

3.拷贝构造函数  

只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰)

  •  特殊的构造  函数名与类名相同
  • 拿已存在的对象生成一个相同类型的新对象
  • 若不是引用 形参传实参是初始化,调用拷贝构造,一直递归,栈溢出
  • 形参 一定要引用,避免递归调用生成形参对象  最终栈溢出程序奔溃
  • 拷贝构造的形参必须是引用,因为引用不生成新对象

4.赋值运算符的重载函数    返回类型  operate  操作符 (参数列表)

用已存在的对象给相同类型的已存在的对象赋值

  • 返回值 类类型的引用 为了能够连续赋值
  • 自定义类型 一般用引用传参  内置类型 传值
  • 默认的拷贝方式是浅拷贝,会让两个指针指向同一块堆内存
  • 释放时,释放野指针,程序奔溃     内存泄漏
  • 有了指针类型需考虑深拷贝
  1. 自赋值
  2. 释放旧的资源
  3. 开辟新的资源
  4. 赋值

不可以被重载的操作符有:

  • 成员选择符(.)            
  • 成员对象选择符(.*)
  • 域解析操作符(::)      
  • 条件操作符(?:)

(除了赋值号=之外,基类中被重载的操作符都将被派生类继承)

5.取地址操作符的重载函数

6.const修饰的取地址操作符的重载函数

关于const修饰类成员:

  1. const修饰形参,一般和引用同时使用
  2. const修饰返回值
  3. const修饰类数据成员,必须在构造函数的初始化列表中初始化
  4. const修饰类成员函数,实际修饰隐含的this,表示在类中不可以对类的任何成员进行修改
  5. 在const修饰的成员函数中要对类的某个数据成员进行修改,该数据成员定义声明是必须加mutable关键字
  •  const对象不可以调用非const成员函数。
  • 非const对象可以调用非const成员函数和const成员函数 。
  • const成员函数内可以调用其它的const成员函数。
  • 非const成员函数内可以调用其它的const成员函数非const成员函数。

三、临时量

  1. 内置类型的临死量  常量
  2. 自定义类型的临时量 变量
  3. 隐式生成临时对象 常量

四、生存周期

表达式结束

优化:

临时对象的生成目的  生成临时对象

以生成临时对象的方式生成新对象

       引用可以提升对象的生存周期

对象的生成一定遵循先构造后析构? 不是     new在堆上

五、static

static  修饰成员变量

  • 不属于对象,属于类作用域    变量存在静态区,被堆中的对象所共享
  • 一定要在类外初始化

static修饰局部变量

  • 对该变量初始化一次
  • 该变量在程序中只有一份内存
  • 该变量的作用域不会改变
  • 该变量的生命周期被延长,直到程序结束才销毁

static关键字修饰全局变量

  • 该变量的作用域仅限于当前文件,工程中的其他文件不可以访问到该全局变量。

 static  修饰成员方法

  1. _cdecl 没有this指针  不依赖对象调用
  2. 不能调用普通的类成员

六、模板  C++泛型

  1. 函数模板       用于生成函数

模板的实例化 :真实类型替换虚假类型的过程

模板的实参推演

  • 有实参
  • 不能产生二义性

模板的特例化优调用先级>模板的版本

模板需要精确匹配

2.类模板    用于生成类

模板的编译

  1. 定义点 模板头部
  2. 调用点 模板函数

<>模板参数列表

  1. 类型参数  typename | class
  2. 非类型参数  int SIZE
    1. 常量
    2. 不能是浮点型
发布了93 篇原创文章 · 获赞 45 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41431406/article/details/97404828