成员初始化列表与构造函数体中的区别详细解析

成员初始化列表和构造函数体都是针对类的构造函数的,它们的作用是在对象被创建时对类的成员进行初始化。

  1. 成员初始化列表

在C++11标准之前,对于类成员变量的初始化是在构造函数体中进行的,而在C++11标准之后,可以使用成员初始化列表来对成员变量进行初始化。成员初始化列表是指在构造函数的参数列表后面加上冒号“:”,接着是一系列的成员变量初始化语句。

示例1:

class Person {
public:
    Person(string name, int age): _name(name), _age(age) {}
private:
    string _name;
    int _age;
};

在这个例子中,我们通过成员初始化列表的方式来对Person类的两个成员变量_name和_age进行初始化,而不需要再在构造函数体内进行赋值操作。

  1. 构造函数体

除了成员初始化列表,我们还可以使用构造函数体对类成员变量进行初始化。在构造函数的参数列表后面不加冒号,而是直接将初始化语句写在{}之中。

示例2:

class Person {
public:
    Person(string name, int age) {
        _name = name;
        _age = age;
    }
private:
    string _name;
    int _age;
};

在这个例子中,我们通过构造函数体中的赋值语句来对Person类的两个成员变量_name和_age进行初始化。相比于成员初始化列表,构造函数体在语法上看起来更加灵活,可以在构造函数体中进行更加复杂的初始化操作。

  1. 区别详解

在使用成员初始化列表和构造函数体进行成员变量初始化时,二者的区别主要有以下两点:

3.1 执行顺序

成员初始化列表的执行顺序是按照成员变量在类中声明的顺序来进行的,在执行构造函数体之前就已经完成了全部的初始化操作。而构造函数体中的赋值语句的执行顺序是按照它们在代码中出现的顺序来进行的。

示例3:

class Person {
public:
    Person(string name, int age): _name(name), _age(_name.length()), _height(180) {
        _age = age;
    }
private:
    string _name;
    int _age;
    int _height;
};

在这个例子中,我们使用了成员初始化列表来对Person类的三个成员变量进行初始化。其中,_age的初始化操作包括了_name.length()的计算,_height的初始化操作使用了默认值180。在构造函数体中,我们又对_age进行了一次赋值操作。在最终的结果中,_height的值是180,_age的值是构造函数输入的值而不是_name.length(),这说明了成员初始化列表的执行顺序优先于构造函数体。

3.2 性能影响

使用成员初始化列表可以在对象被创建时一次性对成员变量进行初始化,避免重复执行赋值操作,因此会比使用构造函数体进行初始化更加高效。

示例4:

class Array {
public:
    Array(int size): _size(size) {
        _data = new int[size];
        for (int i = 0; i < size; i++) {
            _data[i] = i;
        }
    }
private:
    int* _data;
    int _size;
};

在这个例子中,我们使用构造函数体来对Array类的成员变量进行初始化。其中,初始化操作需要先分配一段内存空间,并对其中的元素进行遍历赋值。如果我们使用成员初始化列表来进行初始化,就可以避免重复分配内存和遍历赋值的操作,大大提升了性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:成员初始化列表与构造函数体中的区别详细解析 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • Python中关键字global和nonlocal的区别详解

    Python中关键字global和nonlocal的区别详解 在Python中,global和nonlocal是两个关键字,用于在函数内部访问和修改外部作用域的变量。它们的使用方式和作用范围有所不同,下面将详细解释它们的区别。 global关键字 global关键字用于在函数内部声明一个变量为全局变量,使得该变量可以在函数内外进行访问和修改。具体使用方式如下…

    other 2023年7月29日
    00
  • 公开的免费STUN服务器

    关于“公开的免费STUN服务器”的完整攻略,我可以给您提供以下内容: 什么是STUN服务器 STUN服务器 (Session Traversal Utilities for NAT) 是一个协议,用于在网络中的NAT(网络地址转换)防火墙后建立点对点的通信。NAT防火墙会对本地网络(Private network)与公共互联网(Public Internet…

    other 2023年6月27日
    00
  • 项目中Axios二次封装实例Demo

    下面我将详细讲解”项目中Axios二次封装实例Demo”的完整攻略。 首先,我们需要明确的是Axios是一个重要的HTTP库,用来发送AJAX请求,其具有易用的API、自动转换的JSON数据、客户端和服务端程序员可使用的promise等特性。 但是,在实际的项目中,我们可能需要对Axios进行二次封装,以便我们更好的处理业务逻辑。因此,我们需要遵循以下的步骤…

    other 2023年6月25日
    00
  • 右键显示(隐藏)扩展名的bat代码

    要让Windows系统上的文件扩展名显示或隐藏,可以使用一些批处理命令来完成。下面是一些可用的bat代码来实现这个功能。 显示文件扩展名的bat代码 要显示文件扩展名,请按照以下步骤进行操作: 新建一个文本文件并将其保存为showfileext.bat。 双击打开showfileext.bat,然后在文件中输入以下代码: @echo off reg add …

    other 2023年6月27日
    00
  • vue中slot(插槽)的介绍与使用

    Vue中Slot(插槽)的介绍与使用攻略 什么是插槽? 在Vue中,插槽(Slot)是一种用于在组件中承载内容的机制。它允许我们在组件的模板中定义一些可替换的内容,然后在使用该组件时,将具体的内容传递给插槽,从而实现动态的组件内容。 插槽的基本用法 在组件的模板中,我们可以使用<slot>标签来定义一个插槽。例如: <template&gt…

    other 2023年8月20日
    00
  • SpringBoot获取配置文件内容的几种方式总结

    对于“SpringBoot获取配置文件内容的几种方式总结”,我会给出详细讲解,具体如下: 一、配置文件的基本概念 在 SpringBoot 中,配置文件有两种格式:.properties 和 .yml。 .properties 格式 这是一种基于 key=value 形式构成的配置文件,其中每一行用等号(=)分隔成两部分,左侧是键(key),右侧是值(val…

    other 2023年6月25日
    00
  • Go项目的目录结构详解

    Go项目的目录结构详解 在Go语言中,一个项目的目录结构对于代码的组织和维护非常重要。一个良好的目录结构可以提高代码的可读性和可维护性。下面是一个常见的Go项目的目录结构示例: myproject/ ├── cmd/ │ └── myapp/ │ └── main.go ├── pkg/ │ └── mypackage/ │ └── mypackage.go…

    other 2023年9月7日
    00
  • Windows 11的这19个新功能,你都知道吗?

    Windows 11的这19个新功能,你都知道吗? Windows 11是微软最新发布的操作系统,带来了许多令人兴奋的新功能。在这篇攻略中,我们将详细介绍这19个新功能,并提供两个示例说明。 1. 全新的开始菜单和任务栏 Windows 11带来了全新的开始菜单和任务栏设计。开始菜单现在位于屏幕中间,具有现代化的外观和感觉。任务栏也进行了重新设计,使其更加简…

    other 2023年9月6日
    00
合作推广
合作推广
分享本页
返回顶部