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

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

  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日

相关文章

  • 安卓/iOS版Skype 6.0正式发布及提供下载地址

    安卓/iOS版Skype 6.0正式发布及提供下载地址攻略 Skype是一款广受欢迎的即时通讯和语音通话应用程序。最新版本的Skype 6.0已经正式发布,并提供了安卓和iOS版的下载。本攻略将详细介绍如何下载和安装Skype 6.0,并提供下载地址。 下载和安装Skype 6.0 打开安卓或iOS设备上的应用商店(Google Play Store或App…

    other 2023年8月4日
    00
  • Android 项目正式签名打包教程分享

    Android 项目正式签名打包教程分享 在Android开发中,项目的正式签名打包是非常重要的一步,它确保了应用的身份验证和安全性。本攻略将详细讲解Android项目的正式签名打包过程,并提供两个示例说明。 1. 生成签名密钥 首先,我们需要生成一个签名密钥,用于对应用进行签名。可以使用keytool命令行工具来生成签名密钥。示例命令如下: keytool…

    other 2023年10月13日
    00
  • 华硕(ASUS)路由器192.168.1.1登录地址打不开现象的解决方案

    我将为您提供华硕(ASUS)路由器 192.168.1.1 登录地址打不开现象的解决方案的完整攻略。 1. 原因分析 192.168.1.1是华硕路由器的默认登录地址。如果在尝试登录时,无法打开登录页面,则可能有以下几个原因: 网络连接异常:这是最常见的原因之一。当您的电脑或手机与路由器连接异常,就会导致无法访问路由器登录页面。 输入错误的地址或格式:有时候…

    other 2023年6月26日
    00
  • cbd是什么意思?

    CBD是什么意思? CBD是英文单词Cannabidiol的缩写,意为“大麻二酚”,是大麻植物中的一种非精神活性成分。与大麻的主要精神物质THC相比,CBD具有非常不同的效应和用途。 CBD的特点和用途 CBD具有以下特点和用途: 非精神活性:不会让人产生“嗨”的感觉,不会使人产生上瘾。 镇痛作用:CBD具有止痛效果,用于缓解各种痛苦,包括慢性疼痛、神经性疼…

    其他 2023年4月16日
    00
  • 微信开发者工具怎么修改项目名称?微信开发者工具修改项目名称教程

    下面是微信开发者工具修改项目名称的完整攻略。 步骤1:打开微信开发者工具 首先,打开微信开发者工具。 步骤2:选中需要修改名称的项目 在开发者工具中,找到要修改名称的项目,并选中该项目。 步骤3:点击右上方“详情”按钮 在选中项目后,在开发者工具的右上方找到“详情”按钮,并点击。 步骤4:进入项目详情页面 点击“详情”按钮后,会进入项目的详情页面。 步骤5:…

    other 2023年6月26日
    00
  • mysqldump下载

    以下是关于如何使用mysqldump下载MySQL数据库的详细攻略: 步骤一:安装MySQL 在使用mysqldump下载MySQL数据库之前,您需要先安装MySQL。您可以从MySQL官网下载MySQL安装程序按照安装程序的指示进行安装。 步骤二:打开命令行 在Windows上,您可以按下Win+R键打开行对话框,后输入“cmd”并按下Enter键打开命令…

    other 2023年5月7日
    00
  • Linux Shell函数返回值

    Linux Shell函数返回值攻略 在Linux Shell中,函数是一种将一系列命令组合在一起以完成特定任务的方法。函数可以接受参数,并且可以返回一个值作为结果。本攻略将详细讲解如何在Linux Shell中使用函数并获取返回值。 定义函数 要定义一个函数,可以使用以下语法: function_name() { # 函数体 # 可以包含一系列命令 # 可…

    other 2023年7月29日
    00
  • iOS实现底部弹出PopupWindow效果 iOS改变背景透明效果

    iOS实现底部弹出PopupWindow效果 在iOS开发中,我们可以使用以下步骤实现底部弹出PopupWindow效果,并改变背景透明度。 步骤一:创建PopupWindow视图 首先,我们需要创建一个自定义的视图来实现PopupWindow效果。可以使用UIView或者UIWindow来创建视图,具体选择取决于你的需求。 示例代码: import UIK…

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