首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 中 为 const 成员变量初始化 )

构造函数初始化列表 总结 : 初始化列表 可以 为 类的 成员变量 提供初始值 ; 初始化列表 可以 调用 类的 成员变量 类型的 构造函数 进行成员变量初始化操作 ; 初始化列表 可以 使用 构造函数...中传入的 参数 ; 类初始化时 , 根据定义顺序 , 先调用 成员变量的 构造函数 , 然后调用外部类构造函数 , 析构函数正好相反 ; 实例对象 的 const 成员变量 必须只能在 初始化列表 中进行...初始化 , 所有的构造函数都要进行初始化操作 ; 一、构造函数 的 初始化列表 中 为 const 成员变量初始化 1、初始化 const 常量成员 如果 类 中定义了 被 const 修饰 的 成员变量..., 那么该成员变量 必须被初始化 , 否则会报错 ; 对象中的 const 成员 必须在 声明后 立刻进行初始化 ; const 成员的初始化 只能通过 构造函数 的 初始化列表 进行初始化 ; 注意...进行赋值 的 , 因此 这里 必须在 构造函数的 初始化列表中 对 const 成员变量 进行赋值 ; 2、错误代码示例 - 没有初始化常量成员 在下面的 类 B 中 , 定义了常量 const int

24230

【C++】STL 容器 - vector 动态数组容器 ② ( vector 有参构造函数 | 范围构造函数 | 初始化 n 个 指定元素 | 拷贝构造函数 )

文章目录 一、vector 有参构造函数 1、使用另外的 vector 对象初始化 - 范围构造函数 2、vector 容器初始化 n 个 指定元素 3、vector 容器拷贝构造函数 4、代码示例 -...vector 容器有参构造函数 一、vector 有参构造函数 1、使用另外的 vector 对象初始化 - 范围构造函数 vector 动态数组容器 , 初始化时 , 可以使用另外的 vector...& a 参数 : 为 元素 分配内存的 内存分配器 , 默认 使用标准分配器 std::allocator ; 该构造函数 与 使用两个迭代器范围进行初始化的构造函数略有不同 ; 使用两个迭代器范围进行初始化时..., 会复制指定范围内的所有元素到新创建的 vector 中 ; 本构造函数 使用 n 和 元素值 进行初始化时 , 会复制指定数量的相同元素到新创建的 vector 中 ; 代码示例 : 下面的代码中...vector vec(3, 'A'); 3、vector 容器拷贝构造函数 vector 容器拷贝构造函数 用于创建一个新的 vector 容器对象 , 并将其初始化为另一个已存在的 vector

52810
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】构造函数初始化列表 ① ( 类对象作为成员变量时的构造函数问题 | 构造函数初始化列表语法规则 )

    ; 此时使用 默认无参构造函数 初始化 B , 就会报错 ; 在一个类中 , 其成员变量是 带有参构造函数 的类型 , 这种情况下没有调用 有参构造函数的机会 , 此时就会出现 编译报错情况 ; 在下面的代码中...就是 C++ 中的 构造函数 初始化列表 ; 2、错误代码示例 代码示例 : #include "iostream" using namespace std; class A { public: /...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 二、构造函数初始化列表 ---- 1、构造函数初始化列表语法规则 在 C++ 语言中 , 构造函数初始化列表...是一种用于初始化类的成员变量的方法 ; 构造函数初始化列表 可实现功能 : 为成员变量提供初始值 调用其他 成员变量的 构造函数 来初始化成员变量 构造函数初始化列表语法规则 : 构造函数() : 成员变量名称...初始化列表中的元素由 成员变量的名称 和 初始值组成 , 使用等号 = 连接 ; 在下面的代码中 , 为 B 类定义了默认的构造函数 , 其中定义了 构造函数 初始化列表 ; 在 初始化列表中 , m_age

    67530

    【C++】构造函数初始化列表 ② ( 构造函数 为 初始化列表 传递参数 | 类嵌套情况下 的 构造函数 析构函数 执行顺序 )

    一、构造函数 为 初始化列表 传递参数 1、构造函数参数传递 构造函数 初始化列表 还可以使用 构造函数 中的参数 ; 借助 构造函数 中的参数列表 , 可以为 初始化列表 传递参数 ; 在下面的代码中..., 执行了 A 的构造函数 ; 类 B 中还定义了 有参构造函数 , 接收 3 个参数 , 分别作为 m_age 成员的值 , 和 A 类型成员对象的 有参构造函数 的 2 个参数 , 这是 使用了...构造函数 向 初始化列表 的 参数传递 机制 ; 代码示例 : #include "iostream" using namespace std; class A { public: // 带参构造函数.../ 析构函数 执行顺序 ---- 1、构造函数 / 析构函数 执行顺序 类 B 中 定义了 A 类型 的 成员变量 ; A 类型对象 是 被组合对象 ; 构造函数执行顺序 : 在 初始化 B 类型 实例对象时..., 先执行 被组合对象 A 的构造函数 , 如果 被组合对象 有多个 , 则 按照 成员变量 的定义顺序 进行初始化 ; 注意 : 此处 不是按照 初始化列表 的顺序 进行初始化 ; 析构函数执行顺序

    26130

    C++构造函数体内赋值与初始化列表的区别

    1.C++构造函数初始化列表处提示出现 error: expected ‘{’ before ‘this’ 问题描述下: Linux环境运行,使用g++编译,贴上如下代码出错处已标注于代码中。...在得知网友点拨后,才知道其原因是类对象完成初始化之前,类对象还未成形,不能使用this指针。以上问题的解决方案就是去掉this。...---- 2.初始化列表中不能使用this,那构造函数体内是否可以使用this呢?...答案是,当然可以,因为构造函数对成员数据的初始化在是在初始化列表中完成的,构造函数体内对数据成员所做的工作仅仅是赋值操作,在此之前,类成员数据已经完成了初始化工作,是由其默认构造函数完成的。...所以,这也是编程原则中尽量使用初始化列表的原因。

    87520

    C++构造函数体内赋值与初始化列表的区别

    ,不能使用this指针,因为对象完成初始化之前,类对象还未成形,以上问题的解决办法就是去掉this。...化列表中不能使用this,那构造函数体内是否可以使用this呢?...答案是可以,因为构造函数对成员数据的初始化在是在初始化列表中完成的,构造函数体内对数据成员所做的工作仅仅是赋值操作,在此之前,类成员数据已经完成了初始化工作,是由其默认构造函数完成的。...所以,这也是编程原则中尽量使用初始化列表的原因。...将上面错误代码的类数据成员的初始化改为在构造函数体内赋值,则没有问题,代码修改如下: class someClass { int num; string studentNmae; public:

    1.4K21

    C++核心准则C.41:构造函数生成的对象应该被完全初始化

    C.41: A constructor should create a fully initialized object C.41构造函数生成的对象应该被完全初始化 Reason(原因) A...构造函数有责任为类建立不变式。类的用户应该可以假设构造出的对象式可用的。...如果不能方便地通过构造函数构建合法的对象,使用一个工厂函数。...(简单)所有的构造函数应该初始化所有的成员变量(无论是明确地通过委托构造函数,还是默认构造) (Unknown) If a constructor has an Ensures contract, try...如果构造函数请求了资源(为了生成合法的对象),那个资源应该被析构函数释放。构造函数申请资源然后析构函数释放它们的做法被称为RAII("资源申请即初始化")。

    48500

    C++对象的初始化和清理之构造函数和析构函数分析与实例(一)

    对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候也会删除一些自己信息数据保证安全 C++中的面向对象来源于生活,每个对象也都会有初始设置以及 对象销毁前的清理数据的设置...构造函数和析构函数 对象的初始化和清理也是两个非常重要的安全问题 ​ 一个对象或者变量没有初始状态,对其使用后果是未知 ​ 同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题 c++利用了构造函数和析构函数解决上述问题...对象的初始化和清理工作是编译器强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供 编译器提供的构造函数和析构函数是空实现。...错误:Person (p5);等同于Person p5; 拷贝构造函数调用时机 C++中拷贝构造函数调用时机通常有三种情况 使用一个已经创建完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象...: 如果用户定义有参构造函数,c++不在提供默认无参构造,但是会提供默认拷贝构造 如果用户定义拷贝构造函数,c++不会再提供其他构造函数 示例: class Person { public:

    62420

    C++内存管理深度总结(近万字详解!)

    栈区的大小通常是有限的,过度使用会导致栈溢出错误。 内存映射区(Memory Mapped Region): 例如共享库、动态链接库以及一些特殊的硬件接口对应的内存区域,如显存等。...这与静态内存分配(如全局变量或局部变量)形成鲜明对比,静态内存的大小在编译时就已经确定,并且在程序的整个生命周期内保持不变。...4. operator new与operator delete函数 operator new 和 operator delete 是C++中用于动态内存管理的关键函数。...5. new和delete的实现原理 new 和 delete 是 C++ 中用于动态内存分配和释放的运算符。它们的实现原理涉及到底层的内存管理机制,以及 C++ 构造函数和析构函数的调用。...构造函数调用: 一旦内存分配成功,new 运算符会在分配的内存上调用对象的构造函数来初始化对象。

    19510

    【C++篇】深入内存迷宫:CC++ 高效内存管理全揭秘

    在 C++ 中,new 操作符首先调用 operator new 分配内存,然后调用构造函数初始化对象;而 delete 操作符首先调用析构函数清理对象,然后调用 operator delete 释放内存...在已分配的内存上调用构造函数:通过构造函数来初始化对象。 5.2.2 delete 的工作过程: 调用析构函数:析构函数会清理对象占用的资源(如释放动态分配的内存等)。...new 会调用构造函数:new 不仅分配内存,还会调用构造函数来初始化对象,因此适用于分配类对象时的动态内存管理。...6.4 自定义类型的对象分配 malloc/free 不会调用构造函数和析构函数:malloc 仅仅分配内存,无法初始化对象,也不会调用析构函数来清理对象的资源,因此需要手动处理对象的初始化和销毁。...通过这些详解,你不仅能够理解如何在不同的内存区域中分配和释放资源,还能够掌握如何在复杂的系统中有效管理对象的生命周期。

    39410

    【C++】泛型编程 ⑬ ( 类模板示例 - 数组类模板 | 构造函数和析构函数 的 声明与实现 | 普通成员函数 的 声明与实现 | 外部友元函数 的 声明与实现 )

    一、类模板示例 - 数组类模板 1、需求分析 类模板 的 作用就是 令 算法 和 数据类型分离 ; 本篇博客中 开始 使用 类模板 开发一个 数组类 , 数组 中 可以维护 不同类型的 元素数据 , 如...: int , char , 自定义类 ; 数组 类模板 中 , 需要开发的要素如下 : 构造函数 , 初始化 数组数据 ; 拷贝构造函数 , 根据一个现有的 数组类模板对象 , 创建一个新的 实例对象...{ private: // 数组长度 int m_length; // 指向数组数据内存 的指针 // 指针类型 是 泛型类型 T T* m_space; }; 2、构造函数和析构函数 的...实际类型 , 否则编译时会报错 ; 在 函数体 中使用到了 Array 类型 , 可以不加 实际类型 ; 构造函数 和 拷贝构造函数 中 , 创建 T 类型的数组 , 使用 m_space...cout 函数 " << endl; } 3、普通成员函数 的 声明与实现 重载 数组下标 [] 操作符 , 使用 类模板内部 的 成员函数即可完成 ; 普通成员函数 的 声明 : 数组下标

    52010

    CC++内存详解

    C语言动态内存管理 malloc、realloc、calloc 和 free 是C语言中用于动态内存管理的标准库函数,它们定义在头文件中。...这些函数允许程序在运行时根据需要分配和释放内存,而不是在编译时静态地分配内存。这对于处理未知大小的数据或需要动态增长的数据结构(如链表、树等)特别有用。...C++动态内存申请 C语言的动态内存申请函数对于C++依旧可以使用。但也引入了新的动态内存申请方式:new、delete。...注意,对于数组,不会调用构造函数来初始化每个元素(除非元素类型是类类型且该类提供了默认构造函数),而是进行默认初始化(对于类类型,调用默认构造函数;对于内置类型,不进行初始化)。...对于基本数据类型(如 int、float 等),new 和 delete 主要用于分配和释放内存,不会调用任何特殊的构造函数或析构函数。

    10610

    《C++17 结构化绑定:解锁不同类型处理的秘籍》

    数组类型 对于数组,无论是静态大小数组还是动态分配的数组,结构化绑定都有其独特的处理方式。...如果是多维数组,情况会更加复杂,因为我们需要准确地对每个维度的元素进行绑定,而且不同维度的元素类型可能也不同。 元组类型 元组是 C++ 中用于组合不同类型值的一种数据结构。...对于基本类型,默认初始化可能会有合适的值(如 int 类型的 0),但对于复杂类型,如自定义类,默认初始化可能会调用默认构造函数。如果类的默认构造函数有特殊的逻辑或者限制,我们需要谨慎对待。...例如,某些类在没有合适的初始化参数时可能无法正确构造,这就需要我们考虑是否提供额外的初始化逻辑。 初始化顺序 不同类型的绑定变量在初始化时的顺序也需要关注。...从理解不同数据结构类型的特点,到正确处理初始化过程中的细节,再到采用合适的应对策略,只有这样,我们才能充分利用这一强大的特性,编写出高质量、稳定的 C++ 代码。

    7910

    【C++】动态内存管理

    ,如果我们想要在动态分配时就直接将空间初始化,则需要使用传统的构造方式(使用圆括号),如: int* p = new int(5); //p指向的对象的值为5 当我们想要一次性初始化数组的多个对象时...,我们则需要在[]后面使用{}来初始化,如: int* ptr = new int[10]{ 1,2,3,4,5 }; 注意,当我们只将整形数组中的一部分内容初始化时,整形数组剩余的内容则会被系统默认初始化为...会对数组中的每个类对象都进行构造/析构,如: operator new和operator delete函数 operator new和operator delete函数 new和delete...调用构造函数,而开空间的这部分功能可以使用malloc来完成,但是malloc在设计时采用的报错方式是返回错误码,这和C++中的报错方式——抛异常不符,因此就使用malloc函数按照C++的报错方式专门封装了一个用来开空间的函数...因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化.

    12510

    【C++篇】剖析内存底沉:CC++高效内存管理剖析

    3.1 new和delete操作符 在 C++ 中,new 和 delete 操作符可以用于动态分配和释放内置类型(如 int、float 等)的内存。...在 C++ 中,new 操作符首先调用 operator new 分配内存,然后调用构造函数初始化对象;而 delete 操作符首先调用析构函数清理对象,然后调用 operator delete 释放内存...在已分配的内存上调用构造函数:通过构造函数来初始化对象。 5.2.2 delete 的工作过程: 调用析构函数:析构函数会清理对象占用的资源(如释放动态分配的内存等)。...new 会调用构造函数:new 不仅分配内存,还会调用构造函数来初始化对象,因此适用于分配类对象时的动态内存管理。 6.3 内存分配失败的处理方式 。...malloc/free 不会调用构造函数和析构函数:malloc 仅仅分配内存,无法初始化对象,也不会调用析构函数来清理对象的资源,因此需要手动处理对象的初始化和销毁。 。

    6710

    深入理解C++中的栈与队列:概念、底层机制与高效操作指南

    2.1 数组实现栈 栈可以通过数组来实现,数组提供了一个连续的内存空间来存储元素,通过索引定位来实现操作。 数组实现的步骤 初始化数组:首先需要声明一个固定大小的数组,假设大小为 N。...std::cout 的大小: " << s.size() << std::endl; // 输出 1 3.3 构造函数与析构函数 3.3.1 构造函数 默认构造函数:创建一个空栈。...复制构造函数:可以通过另一个stack对象来初始化新的栈。...std::cout << "队列中元素个数: " << q.size() << std::endl; 6.3 构造函数与析构函数 6.3.1 构造函数 queue的构造函数可以通过不同方式初始化队列:...复制构造函数:可以通过另一个队列对象来初始化新队列。

    83510

    三、从C语言到C++(三)

    例如:int a = int(); 或 vector vec(10);(这里的vec被值初始化为包含10个0的vector) 列表初始化(C++11及以后): 对于数组、聚合类型(如结构体和类...使用列表初始化和统一初始化语法可以提高代码的可读性和安全性,特别是在处理复杂的数据类型时。 对于类类型,尽量使用构造函数初始化列表来初始化成员变量,而不是在构造函数的函数体内进行赋值。...原因如下: 构造函数和析构函数的调用:当使用new[]分配数组时,C++会为数组中的每个对象调用构造函数(如果需要)。...同样地,当使用delete[]释放数组时,C++会为数组中的每个对象调用析构函数。...内存管理:new[]不仅分配了数组中每个对象所需的内存,还分配了额外的内存来存储数组的大小或其他信息(尽管这通常是编译器实现的细节)。

    9410

    天幕容器vector的底层实现,让这个容器的建造在你面前一览无余

    vector 是C++标准模板库(STL)中最常用的数据结构之一,作为一种动态数组,具有如下特点: 动态扩展:vector 能够根据需要动态扩展其容量,用户不必担心数组长度的限制。...区间构造函数:从两个迭代器构造一个 vector,用于从已有的数据范围初始化 vector。 填充构造函数:构造一个指定大小,并用指定值填充的 vector。...初始化列表构造函数:使用C++11的初始化列表语法,允许用户通过 {} 方式来初始化 vector。 1. 默认构造函数 默认构造函数用于构造一个空的 vector,我们直接让所有指针初始化为空即可。...填充构造函数 填充构造函数可以根据用户传入的大小 n,以及指定的值 val 来初始化 vector。它的实现分为两种,一种是使用整数类型的构造函数,另一种是使用 size_t 类型的构造函数。...1. resize 方法 resize 方法用于调整 vector 的大小。如果新大小小于当前大小,它会截断多余的元素;如果新大小大于当前大小,它会扩展 vector 并用给定的值填充新空间。

    12710

    《逆袭进大厂》之C++篇49问49答

    当数组名当做形参传递给调用函数后,就失去了原有特性,退化成一般指针,多了自增、自减操作,但sizeof运算符不能再得到原数组的大小了。...标准C++中的字符串类取代了标准C函数库头文件中的字符数组处理函数(C中没有字符串类型)。 C++中用来做控制态输入输出的iostream类库替代了标准C中的stdio函数库。...非静态成员的数据类型大小之和。 编译器加入的额外成员变量(如指向虚函数表的指针)。 为了边缘对齐优化加入的padding。...大端模式中的存储方式为: ? 了解了大小端存储的方式,如何在代码中进行判断呢?...placement new构造起来的对象数组,要显式的调用他们的析构函数来销毁(析构函数并不释放对象的内存),千万不要使用delete,这是因为placement new构造起来的对象或数组大小并不一定等于原来分配的内存大小

    2K10
    领券