C++中类的构造函数初始值列表解读

 更新时间:2022年11月24日 11:13:18   作者:棉猴  
这篇文章主要介绍了C++中类的构造函数初始值列表,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

C++类的构造函数初始值列表

1 通过构造函数初始值列表来初始化成员变量

C++中类的构造函数初始值列表可以对类的成员进行初始化。

class myClass{
  public:
  int i;
  myClass(): i(1)
  {
  }
};

其中,类myClass的构造函数中包含了初始值列表,对成员变量i进行初始化。

2 通过构造函数的函数体来初始化成员变量

除了通过构造函数初始值列表来初始化成员变量外,还可以通过构造函数的函数体来初始化成员变量。

class myClass{
  public:
  int i;
  myClass()
  {
    i = 1;
  }
};

此时,成员变量i的初始值是1。

3 类包含常量或引用成员变量

当类包含有常量成员变量或者引用成员变量时

class myClass{
public:
  int i;
  const int ci;
  int& ri;
};

如果类没有定义构造函数,则使用默认的构造函数来创建对象

myClass mc;

此时,编译器会报错,报错信息为“error C2280: “myClass::myClass(void)”: 尝试引用已删除的函数”。因此,需要编写myClass类的构造函数对常量成员变量和引用成员变量进行初始化。

3.1 不能在构造函数的函数体来初始化常量或引用成员变量

在myClass类的构造函数体内对常量或引用成员变量进行初始化

myClass()
{
  i = 1;
  ci = 2;
  ri = i;
}

此时,编译器会报错,报错信息为“ error C2789: “myClass::ci”: 必须初始化常量限定类型的对象”。

3.2 在类的构造函数初始值列表来初始化常量或引用成员变量

myClass():i(1),ci(2),ri(i)
{
}

此时,程序可以成功编译。

C++类的构造函数的作用

构造函数的作用

为了解决给对象成员初始化赋值的问题,C++提供了“构造函数(constructor)”来处理对象的初始化。构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。

构造函数的名字必须与类名同名,而不能由用户任意命名,以便编译系统能识别它并把它作为构造函数处理。构造函数不返回任何值,所以,函数没有返回类型。

例如,定义一个C++类,类名是 student,如下:

class student       //以class开头

{   ... };

那么,构造函数的函数名与类名相同,所以,构造函数的函数名是student,例如:

student();                      //没有参数的构造构造函数;

student(char* name);     //带参数的构造函数;

构造函数的功能是由用户定义的,用户根据初始化的要求设计函数体和函数参数。

在讲解构造函数之前,我们先写一个例子,测试构造函数的使用。

测试代码如下:

程序的运行结果有:

在类student中定义了构造函数:

student(char* pn, char* pa, long long n);

构造函数的名称和所在的类同名。在建立对象时自动执行构造函数,它的作用是对定义的对象进行初始化。例如给成员变量赋初值,赋值语句是写在构造函数的函数体中,只有在调用构造函数的时候,才执行这些赋值语句,为当前对象的成员变量赋值。

在上面的例子中,我们定义了stud对象,在定义对象的同时,给对象的成员变量赋值。

定义对象如下:

student stud("wkf", "www.mylinux.vip", 13926572996);

此时,定义stud对象,给对象设置3个数据,根据这些数据的类型,就调用对应的构造函数:

student(char* pn, char* pa, long long n);

所以,把参数设置到对应的构造函数中,如下:

pn = "wkf";

pa = "www.mylinux.vip";

n = 13926572996;

给构造函数的参数设置数据之后,就执行构造函数。

上面是在类内定义构造函数,也可以只在类内对构造函数进行声明,而在类外定义构造函数。在类外定义构造函数,如下:

可以看到,把student(char* pn, char* pa, long long n);构造函数放在类外定义。

有关构造函数的使用,有以下说明:

(1) 构造函数的名称,与类名一样。

(2) 什么时候调用构造函数?定义类对象的时候,开始构建对象,调用类的构造函数。

(3) 构造函数没有返回值,因此,也不需要在定义构造函数时声明函数返回类型,这是它和一般函数的一个重要的不同之点,不能写成:

void student ()

{.....}

构造函数的作用主要是用来对对象进行初始化。

(4) 构造函数是建立对象时由系统自动执行的,而且只执行一次。所以,构造函数不能够由用户调用。

(5) 在构造函数的函数体中不仅可以对成员变量赋初值,而且,可以包含其他语句,例如cout语句。但是,一般不提倡在构造函数中加入与初始化无关的内容。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++动态加载so/dll库的实现

    C++动态加载so/dll库的实现

    本文主要介绍了C++动态加载so/dll库的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • C++中的对象指针总结

    C++中的对象指针总结

    以下是对C++中的对象指针进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • C语言实现简单的抽奖系统

    C语言实现简单的抽奖系统

    这篇文章主要为大家详细介绍了C语言实现简单的抽奖系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • C++使用初始化列表的方式来初始化字段的方法

    C++使用初始化列表的方式来初始化字段的方法

    今天小编就为大家分享一篇关于C++使用初始化列表的方式来初始化字段的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 将Deepseek接入本地Vscode的图文步骤

    将Deepseek接入本地Vscode的图文步骤

    本文主要介绍了将Deepseek接入本地Vscode的图文步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • C++  线程(串行 并行 同步 异步)详解

    C++ 线程(串行 并行 同步 异步)详解

    这篇文章主要介绍了C++ 线程(串行 并行 同步 异步)详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • win10环境下C++ vs2015编译opencv249的教程

    win10环境下C++ vs2015编译opencv249的教程

    这篇文章主要介绍了win10环境下C++ vs2015编译opencv249的教程,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Qt实现TCP同步与异步读写消息的示例代码

    Qt实现TCP同步与异步读写消息的示例代码

    这篇文章主要为大家详细介绍了如何在 Qt 中实现 TCP 客户端和服务器的同步和异步读写消息,有需要的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • C++类和对象深入探索之分文件编写点和圆的关系详解

    C++类和对象深入探索之分文件编写点和圆的关系详解

    先前把C++类和对象的封装讲完了,并且留下了一个判断两个立方体是否相等的案例,但是那么多知识点,仅仅一个案例是不够的,所以再来一个分文件编写点圆关系的案例;创建圆类和点类,圆类包含点类,算是一个嵌套吧,顺便复习一下分文件编写的方法,开整
    2022-05-05
  • QT连接Mysql数据库的实现步骤

    QT连接Mysql数据库的实现步骤

    本文主要介绍了QT连接Mysql数据库的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论