C++学习-面向对象
4-面向对象
面向对象具有三大特性,继承、封装、多态
定义类以及实例化
1 | const double PI = 3.14; |
封装
设计类时,应该针对类的使用场景封装对应的成员,访问权限有三种:
- 公开: public :类外可以访问
- 保护: protected :类内可以访问,子类可以访问,类外不能访问
- 私有: privite : 只有当前类内可以访问
C++中struct和class的区别
- struct默认访问权限为 public
- class默认访问权限为 private
一般在开发中,会将成员属性设置为私有,并按需对外提供get/set方法
构造函数和析构函数
C++在对象实例化的时候,会调用构造函数和析构函数对对象进行初始化和销毁操作。如果不做实现,编译器会自动提供空实现。
构造函数语法
- 构造函数没有返回值,不写void
- 函数名=
类名
- 构造函数可以有参数,所以可以发生重载
- 程序会在调用对象的时候自动调用,只调用一次
析构函数语法
- 析构函数没有返回值,不写void
函数名=
~类名
析构函数不可以有参数,不可以发生重载
- 程序会在对象销毁前自动析构,不需要手动调用,只调用一次。
Demo
1 | class Person |
构造函数分类
两种分类方式:
按参数分为: 有参构造、无参构造
按类型分为:普通构造、拷贝构造(复制构造)
复制构造函数的函数头为: ClassName(const ClassName ¶m)
- 在值传递的时候,会自动调用其拷贝构造函数作为形参
- 在局部变量值返回的时候,会回收局部变量空间,调用拷贝构造函数返回一个新的对象。
三种调用方式:括号、显示法、隐式转换法
- 不要用括号法调用默认的无参构造,会被认为是一个函数声明。
- 不要利用拷贝构造函数初始化匿名对象,编译器会认为是一个对象的声明。
构造函数调用规则
默认C++会给一个类添加3个函数
- 无参构造
- 无参析构
- 拷贝构造(对所有属性进行值拷贝)
- 如果用户定义了有参构造,则不再提供无参构造,但仍然提供拷贝构造
- 如果用户定义了拷贝构造,则不再提供默认构造
深浅拷贝
浅拷贝: 简单赋值拷贝
深拷贝: 在堆分配空间进行拷贝
C++默认提供的拷贝构造函数是浅拷贝,这样会带来一个问题。
当类的属性中包含指向堆内存的指针时,浅拷贝的对象将会使得拷贝出的对象指向同一个地址。如果在析构函数中对该空间进行释放,就会由于同一个空间被释放两次造成错误。所以需要采取深拷贝将堆中的对象也进行拷贝。
1 | class Person{ |
初始化列表
构造函数可以使用类名(参数, 参数, ...):属性(参数),属性(参数)...的方式对对象的值初始化
1 | class Person{ |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.