啃书系列持续更新ing,关注博主一起xiao习鸭~
系列文章:
啃书《C++ Primer Plus》之 C++ 函数指针
啃书《C++ Primer Plus》之 C++ 名称空间1
啃书《C++ Primer Plus》之 C++ 名称空间2
啃书《C++ Primer Plus》之 C++ 引用
啃书《C++ Primer Plus》之 const修饰符修饰 类对象 指针 变量 函数 引用
啃书《C++ Primer Plus》之 枚举 内容大全
啃书《C++ Primer Plus》之 内存模型(上) 变量的存储持续性 作用域 连接性
这一节进入面向对象内容的第二部分,来探讨学习一个非常重要且特殊的成员函数:构造函数。
如果您还不知道构造函数是什么,那么可以简单的理解为:构造函数是用来构造对象函数,用来初始化对象内部的数据,常在一个对象产生的时候被调用,用于“构造”这个对象。当然,它也不仅仅是在初始化的时候被调用,当对象需要被重新构造,如在赋值的时候,它也会被调用,这点在下面的文章中会有所体现。
本文会先介绍有关构造函数的创建相关问题。在创建构造函数后,再来介绍有关构造函数的一些使用。
下面是本节的思维导图。
here we go~
创建构造函数
学习使用构造函数的第一步,当然是创建构造函数。
构造函数的声明与定义
首先,构造函数的位置应该在其所属的类中,其声明与定义的格式如下:
声明(类内):
类名(参数列表);
实现(类外):
类名::构造函数名(参数列表):初始化列表{};
可以看到,构造函数的声明与定义同一般的成员函数十分相近。在类内需要给出函数的形式,在类外实现时需要使用作用域解析符来表明从属关系。
通常,一个类的声明与定义我们分别写在头文件和对应的cpp文件中。现在,把它写成代码:
classA.h
class A
{
public:
A(int);
private:
int k;
};
classA.cpp
#include"classA.h"
A::A(int k){
this->k = k;}
当然,上面的程序对于构造函数的实现方式不是固定的,您也可以选择使用 inline 修饰。或者干脆将它直接写在声明处(通常不建议这么做,声明和定义应该分别放置在头文件和.cpp文件以降低可能存在的编译依赖)。
从上面的程序可以看到构造函数的一些特点:
- 构造函数没有返回类型,也不能返回任何值
- 构造函数的函数名就是类名
- 构造函数受访问限制
- 构造函数具有初始化列表用以初始化成员
- 构造函数带有this指针
对于前两条这里不过多解释,他们是构造函数的硬性规定。
第三点说到了构造函数的访问权限,在上面的例子中,访问权限是 public 的,这意味着可以在类外直接调用它。但是如果我们将访问权限改为 private 那么就只能在类内部使用它,在类外则不能使用这个构造函数。
下面我们就来分析一下第四、第五点带来的内容。
构造函数的初始化列表
构造函数的初始化列表的形式与位置如下:
初始化列表形式: 成员1(初始化值),成员2(初始化值)...
初始化列表位置: 构造函数名称(参数列表):初始化列表{}
我们来举个粟子:
class B
{
};
class A
{
public:
A(int k = 0)