C++ 类
Posted tzsh1007
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 类相关的知识,希望对你有一定的参考价值。
C++类
- C++中可以使用struct、class来定义一个类
- struct、class的区别
- struct的默认成员权限是public
class的默认成员权限是private
// 类的定义 struct Person // 成员变量 int m_age; // 成员函数 void display() cout << "display()" << endl; ; class Person public: // 成员变量 int m_age; // 成员函数 void display() cout << "display()" << endl; ;
C++一般命名规范
- 全局变量:g_
- 成员变量:m_
- 静态变量:s_
- 常量 :c_
- 使用驼峰标识
this
- this是指向当前对象的指针,对象在调用成员函数的时候,会自动传入当前对象的内存地址
- 因为this是指针,访问成员变量时用 ->
C++ 对象初始化
- 前言:内存空间的布局,一般都有以下几个大区域
- 代码段(代码区):用于存放代码
- 数据段(全局区):用于存放全局变量
- 栈空间:每调用一个函数会给它分配一段连续的栈空间,等函数调用完毕后会自动回收这段栈空间;自动分配和回收
- 堆空间:需要主动申请和释放
堆空间的初始化
int *p1 = new int; // 未被初始化 int *p2 = new int(); // 初始化0 int *p3 = new int(5); // 初始化为5 int *p4 = new int[3]; // 数组元素未被初始化 int *p5 = new int[3](); // 3个数组元素都被初始化0 int *p6 = new int[3]; // 3个数组元素都被初始化0 int *p7 = new int[3]5; // 数组首元素被初始化为5, 其它数组元素都被初始化0
- 对象的内存可以存在于3个地方
- 全局段(数据段):全局变量
- 栈空间:函数里面的局部变量
- 堆空间:动态申请内存(malloc、new等)
构造函数
- 也叫构造器,在对象创建的时候自动调用,一般用完成对象的初始化工作
- 特点
- 函数名与类名同名,无返回值(void)都不用写,可以有参数,可以重载,可以有多个构造函数
- 一旦自定义了构造函数,必须用其中一个自定义的构造函数来初始化对象
- 通过malloc分配的对象不会调用构造函数
- 父类构造函数的调用
- 子类的构造函数默认会调用父类的无参构造函数
- 如果子类的构造函数显示的调用父类的有参构造函数,就不会再去默认调用父类的无参构造函数
- 如果父类缺少无参构造函数,子类的构造函数必须显示调用父类的有参的构造函数
析构函数
- 也叫析构器,在对象销毁的时候自动调用,一般用于完成对象的清理工作
- 特点
- 函数名以
~
开头,无返回值(void)都不能写,无参,不可以重载,有且只有一个析构函数
- 函数名以
- 注意
- 通过malloc分配的对象free的时候不会调用析构函数
- 构造和析构函数都要声明为
public
,才能被外界使用
int *p1 = new int(); delete p1; int *p1[] = new int[3]; delete[] p1;
初始化列表
- 一种便捷的初始成员变量的方式
- 只能用在构造函数中
- 初始化顺序只跟成员变量的声明顺序有关
- 如果函数声明和实现是分离的
- 初始化列表只能写在函数的实现中
- 默认参数只能写在函数的声明中
- 构造函数间的调用只能在初始化列表中
命名空间
- 命名空间可以用来避免命名冲突
- 命名空间可以嵌套,C++有个默认的全局命名空间,自定义的命名空间默认嵌套在它里面
类的继承及访问权限
- 成员访问权限、继承方式有3种
public
公共的,任何地方都可以访问(struct默认)protected
当前类内部和子类内部可以访问private
私有的,只有当前类内部可以访问(class默认)
- 子类内部访问父类成员变量的权限,取以下2项中权限最小的那个
- 成员本身的访问权限
- 继承父类的继承方式
- 一般开发中继承方式用public,这样能保留父类的成员访问权限
- 访问权限不影响内存布局
- 成员变量的内存布局
- 父类成员变量在前,子类成员变量在后
以上是关于C++ 类的主要内容,如果未能解决你的问题,请参考以下文章