广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++类成员初始化的三种方式
  • 758
分享到

C++类成员初始化的三种方式

2024-04-02 19:04:59 758人浏览 安东尼
摘要

目录一、初始化方式1、初始化方式一:初始化列表2、初始化方式二:构造函数初始化3、初始化方式三:声明时初始化(也称就地初始化,c++11后支持)二、声明时初始化->初始化列表-

前言:

在C++98中,支持了在类声明中使用等号“=”加初始值的方式,来初始化类中静态成员常量。这种声明方式我们也称之为“就地”声明。就地声明在代码编写时非常便利,不过C++98对类中就地声明的要求却非常高。如果静态成员不满足常量性,则不可以就地声明,而且即使常量的静态成员也只能是整型或者枚举型才能就地初始化。而非静态成员变量的初始化则必须在构造函数中进行。

首先,先得了解一下C++支持哪几种类成员初始化的方式,你常用的又是哪一种。

一、初始化方式

1、初始化方式一:初始化列表


class A
{
public:
    int a; // 初始化列表
    A(int a_):a(a_){}
};

2、初始化方式二:构造函数初始化


class A
{
public:
    int a; // 初始化列表
    A(int a_, bool b) { a = a_; }
};

3、初始化方式三:声明时初始化(也称就地初始化,c++11后支持)


class A
{
public:
    int a = 1; // 声明时初始化
    A() {}
};

在C++98中,支持了在类声明中使用等号“=”加初始值的方式,来初始化类中静态成员常量。这种声明方式我们也称之为“就地”声明。就地声明在代码编写时非常便利,不过C++98对类中就地声明的要求却非常高。如果静态成员不满足常量性,则不可以就地声明,而且即使常量的静态成员也只能是整型或者枚举型才能就地初始化。而非静态成员变量的初始化则必须在构造函数中进行。比如,如下代码在c++98中编译


class Init
{
public:
    Init(): a(0) []
    Init(int d): a(d) {}
private:
    int a;
    const static int b = 0;

    int c = 1;           // member, cannot pass build
    static int d = 0;    // member, cannot pass build

    static const double e = 1.3;      // not int or enum type, cannot pass build
    stati const char* const f = "e";  // not int or enum type, cannot pass build
}

这非常不方便,所以在C++11中,标准允许非静态成员变量的初始化有多种形式。具体而言,除了初始化列表外,在C++11中,标准还允许使用等号= 或者 花括号{} 进行就地的非静态成员变量初始化。


struct init {
    int a = 1;
    double b {1.2};
};

大家知道,有几种情况下推荐优先使用列表初始化

  • const成员变量只能用成员初始化列表来完成初始化,而不能在构造函数内赋值
  • 初始化的数据成员是对象
  • 需要初始化引用成员数据

具体的原因这里不细述,大家可以去看一下《C++ Primer》。

构造函数初始化的本质是赋值操作("="),这个方法存在两个问题,一个是比起初始化列表和就地初始化,此方式的效率偏低;第二个是可能存在错误隐患

先说第一个,赋值过程中会产生临时对象,临时对象的构造析构会造成效率损耗,初始化列表的方式就避免了产生临时对象缩带来的问题。

第二个是,如果你没有重写或者禁止赋值构造函数,c++会悄悄的加上默认的赋值构造函数,这个时候也有可能带来问题。

从C++11之后,这三种初始化的方法都可以使用,并不会存在冲突,但是,他们之间是有优先级顺序的,这个优先级来源于他们在初始化的时间顺序,后面初始化的会把前面的覆盖掉,成员变量的初始化顺序是

二、声明时初始化->初始化列表->构造函数初始化

因此假如三种初始化方式同时存在的话,那么最后保留的成员变量值肯定是构造函数中初始化的值。


#include <iOStream>
using namespace std;
class A 
{
public:
    int a = 1;
    A(int a_) :a(2) { a = 3; }
};

int main()
{
    A a;
    cout << "a.a=" << a.a << endl;
    return 0;
}

// a.a=3

既然初始化方式这么多,那么什么时候适用哪种呢?

1、声明时初始化的使用场景

一个优点是直观,你在声明的时候顺便给一个初始值,bravo,别人在看你代码的时候,点一下调到声明也能看到你赋予的初始值,不用再去看构造函数那里给的什么值
第二个优点更有用了,比如你要定义多个构造函数,每个构造函数都用列表初始化的方法初始化,多麻烦呀,请看下面的例子,妈妈看了再也不用担心我想用其他初始化方法了


class Group {
public:
    Group() {}
    Group(int a): data(a) {}
    Group(Mem m): mem(m) {}
    Group(int a, Mem m, string n): data(a), mem(m), name(n) {}
private:
    int data = 1;
    Mem mem{0};
    string name{"Group"};
};

2、列表初始化的使用场景

前面说过了三个场景,这里赘述一下

  • const成员变量只能用成员初始化列表来完成初始化,而不能在构造函数内赋值
  • 初始化的数据成员是对象
  • 需要初始化引用成员数据

但是,需要注意列表初始化的顺序,不过IDE会提示你的

3、构造函数初始化的使用场景

第一个就是拷贝和赋值构造函数里(不然怎么叫赋值构造函数呢)
第二个就是比较无聊的情况了,比如你想把几个成员函数都初始化成一个值,请看下面例子


class Group {
public:
    Group() {data1 = data2 = data3 = 0;}
private:
    int data1;
    int data2;
    int data3;
};

一言以蔽之,优先就地初始化和列表初始化。

到此这篇关于C++类成员初始化的三种方式的文章就介绍到这了,更多相关C++类成员初始化的方式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++类成员初始化的三种方式

本文链接: https://www.lsjlt.com/news/136900.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++类成员初始化的三种方式
    目录一、初始化方式1、初始化方式一:初始化列表2、初始化方式二:构造函数初始化3、初始化方式三:声明时初始化(也称就地初始化,c++11后支持)二、声明时初始化->初始化列表-...
    99+
    2022-11-12
  • 数组的三种初始化方式
    1. 直接初始化:在声明数组的同时给出初始值,例如:`int[] arr = {1, 2, 3, 4, 5};` 这种方式适用于已知...
    99+
    2023-09-01
    数组
  • C++中怎么初始化类静态成员
    这篇文章将为大家详细讲解有关C++中怎么初始化类静态成员,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C++类静态成员初始化相关实现代码介绍:class mytestclass&n...
    99+
    2023-06-17
  • c++数组初始化的方式有哪几种
    C++数组可以使用以下几种方式进行初始化:1. 使用花括号{}初始化:cppint arr1[] = {1, 2, 3, 4, 5}...
    99+
    2023-10-18
    c++
  • C#基类的初始化方法
    今天小编给大家分享一下C#基类的初始化方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。基类的初始化派生类继承了基类的成员变...
    99+
    2023-06-17
  • java对类对象成员的初始化方法是什么
    Java对类对象成员的初始化方法是通过构造方法来实现的。构造方法是一个特殊的方法,用于创建对象并对成员变量进行初始化。在Java中,...
    99+
    2023-09-09
    java
  • c语言数组初始化的方式有哪几种
    在C语言中,数组的初始化方式有以下几种:1. 声明时指定元素的初始值:```cint arr[] = {1, 2, 3, 4, 5}...
    99+
    2023-09-20
    c语言
  • Java类变量和成员变量初始化的过程
    这篇文章主要讲解了“Java类变量和成员变量初始化的过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java类变量和成员变量初始化的过程”吧!一、类的初始化对于类的初始化:类的初始化一般只...
    99+
    2023-06-17
  • Spring成员对象注入的三种方式详解
    目录一、@Autowired注解@Qualifier@Primary二、@Resource注解三、@Inject和@Named注解总结当一个类运行需要调用一个成员对象,成员对象也是被...
    99+
    2022-11-13
  • 总结Bean的三种自定义初始化和销毁方法
    目录Bean三种自定义初始化和销毁一. 三种方法概述二. 方法详述spring初始化后获取自定义注解Bean一.新建注解类二.新建接口类三.实现接口ApplicationListen...
    99+
    2022-11-13
  • C语言数组初始化的方式有哪些
    C语言数组的初始化方式有以下几种:1. 使用花括号{}初始化:可以使用花括号{}将一组初始值按顺序赋给数组元素。例如:int arr...
    99+
    2023-09-04
    C语言
  • Java中初始化List集合的八种方式汇总
    目录1、常规方式2、Arrays 工具类3、Collections 工具类4、Lists 工具类5、匿名内部类6、ImmutableList7、Java8 Stream8、Java9...
    99+
    2022-11-13
  • 浅谈SpringBoot资源初始化加载的几种方式
    目录一、问题二、资源初始化一、问题   在平时的业务模块开发过程中,难免会需要做一些全局的任务、缓存、线程等等的初始化工作,那么如何解决这个问题呢?方法有多种,但具体又要怎么选择呢?...
    99+
    2022-11-12
  • Java 中HashMap初始化的另一种方式是怎么
    Java 中HashMap初始化的另一种方式是怎么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。如果你接触过不同的语言,从语法和代码层面来说,Java 是一种不折不扣的“臃...
    99+
    2023-06-19
  • Spring成员对象注入的三种方式是什么
    本篇内容主要讲解“Spring成员对象注入的三种方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring成员对象注入的三种方式是什么”吧!当一个类运行需要调用一个成员对象,成员对象也...
    99+
    2023-06-29
  • C语言常见问题——数组初始化的四种方法
    在C语言中,我们可以使用四种方法来初始化数组:1. 逐个赋值初始化:通过为数组的每个元素赋值来初始化数组。例如:```cint ar...
    99+
    2023-09-13
    C语言
  • SpringBoot整合liquibase及liquibase生成初始化脚本的方式
    目录一. SpringBoot集成liquibase二. liquibase生成数据库表和数据的初始化脚本一. SpringBoot集成liquibase 项目集成liquibase...
    99+
    2022-11-13
  • oracle 初始化参数文件spfile、pfile及修改参数的两种方式分别是什么
    这篇文章给大家介绍oracle 初始化参数文件spfile、pfile及修改参数的两种方式分别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。oracle数据库在启动过程中要读取初...
    99+
    2022-10-19
  • 进一步了解C++函数的各种参数以及重载,了解C++部分的内存模型,C++独特的引用方式,巧妙替换指针,初步了解类与对象。满满的知识,希望大家能多多支持
    C++的编程精华,走过路过千万不要错过啊!废话少说,我们直接进入正题!!!! 函数高级 C++的函数提高 函数默认参数 在C++中,函数的形参列表中的形参是可以有默认值的。 语法:返回值类型 函数名 (参数 = 默认值){} 示例: #...
    99+
    2023-09-17
    c语言 c++ 开发语言 java 核心编程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作