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

C++中五花八门初始化规则

定义于任何函数体之外类变量会先进行初始化再执行默认初始化,定义在函数体内部类变量会直接执行默认初始化。...,如果没有在构造函数初始值列表中显式地初始化数据成员,那么成员将在构造函数体之前执行默认初始化,例如: // 通过构造函数初始值列表初始化数据成员: 数据成员通过提供初始值进行初始化 class Cat...数组默认初始化 如果定义数组时提供了初始值列表,那么未定义元素若是内置类型或者有合成默认构造则会先进行初始化,如果元素是类类型,再执行默认构造函数 如果定义数组时未提供初始化列表,则每个元素执行默认初始化...中圆括号与花括号初始化 总的来说,圆括号是通过调用vector构造函数进行初始化,如果使用了花括号那么初始化过程会尽可能会把花括号内值当做元素初始值列表来处理。...列表初始化返回值 C++11新标准规定,函数可以通过列表初始化来对函数返回临时量进行初始化: #include #include std::vector<std:

2.6K10

C++奇迹之旅:vector使用方法以及操作技巧

它提供了动态调整大小能力,并且在底层维护一个连续存储区域,使得元素可以通过索引进行快速访问。...任何非负值 构造函数 std::vector 四种不同构造函数分别是: 默认构造函数 explicit vector (const allocator_type& alloc = allocator_type...()); 这个构造函数创建一个空 std::vector,allocator_type 是用来分配内存分配器类型,默认使用 std::allocator,构造函数是 explicit ,这意味着它不能进行隐式转换或复制初始化...() { // 默认构造函数 vector v1; // 遍历 v1 并输出其中元素,由于 v1 是空,所以没有任何输出 for (const auto&...通过预先分配足够存储空间,可以避免频繁重新分配,从而提高性能,特别是在知道将要存储大量元素时。

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

    C++ STL学习之【vector模拟实现】

    iterator _end_of_storage; //指向可用空间下一个位置 }; } 1、默认成员函数 默认成员函数需要自己设计,因为涉及深浅拷贝问题 默认构造函数、带参构造函数、迭代器区间构造...,有多种初始化方法: 在定义成员变量后设置缺省值 在创建新对象前手动进行初始化(初始化列表) 调用 默认构造函数 进行初始化 这里采用是初始化列表调用 默认构造函数 初始化方式 拷贝构造 //...类型,实际调用时是这样 this[pos] = v[pos](string 对象,调用对应赋值重载函数) 注意: vector 拷贝构造函数必须自己写,默认生成是 浅拷贝 现代写法着重交换思想...swap 交换函数,因为 std::swap 中会发生多次拷贝构造,效率较低,而 swap 效率是极高,只需交换三个成员变量 vector 中使用是随机迭代器,可以使用库中排序函数 std::sort...和 迭代器失效 问题 如果你觉得本文写还不错的话,可以留下一个小小赞,你支持是分享最大动力!

    22920

    初始化|这些年踩过

    :a_(a) {} }; foo f1 = 42; •对于聚合类,也可以使用后面跟括号方式(括号中传入参数),对于不需要参数则不能添加括号,否则编译器会认为是函数声明 foo f1;...上述代码区别其实已经在注释里面讲了,对于v来说用是列表初始化方式,其构建了一个vector,里面有2个元素10和20;对于w,其也是构建了一个vector,里面有10个元素,且每个元素值都为20,...,曾经也这么以为~~~通过cppinsights分析,发现v2类型是std::vector,如果想让v2类型是vector的话,则必须显示指定类型,即如下: std::vector<std...,会报错如下: remove parentheses to default-initialize a variable 意思是去掉后面的**()以便调用默认构造函数。...参数作为参数构造函数重载,因此该构造函数将是首选。

    18910

    【C++】适配器模式 -- stackqueuedqueue

    > st1; stack> st2; } 如上,vector 和 list 都可以作为 stack 适配容器,我们可以通过给定不同第二个模板参数来使用不同容器适配...> class stack { public: //构造和析构不用写,默认生成构造和析构对于自定义类型会调用它们构造和析构函数...: 1、在类和对象部分我们学习了类六大默认成员函数以及初始化列表,知道了如果我们不写构造函数编译器会自动生成一个无参默认构造函数,它对于自定义类型会去调用自定义类型默认构造; 2、同时,类成员变量真正初始化工作是在初始化列表完成...即默认构造接口我们可以直接删除,此时 MyQueue 会根据自动生成默认构造函数完成对 pushST 和 popST 初始化;我们也可以不管它,因为即使我们不在初始化列表显式对 pushST 和...{ public: //构造和析构不用写,默认生成构造和析构对于自定义类型会调用它们构造和析构函数 bool empty() const { return _Con.empty(

    32200

    手撕vector

    vector本质也就是一个空间可以动态变化数组,所以这里就挑一些些容易踩坑地方讲解一下,在最后会附上完整代码。...通过上图不难发现,我们可以通过end _ of _storag - start 得到vector容量,通过finish - start得到vectorsize 虽然模拟实现整体是跟着sgi版本...对于第一个构造函数来说,编译器需要将int类型强转为size_t,但是第二个构造函数是一个模板,可以直接将类型推演成int,直接就将两个类型都匹配上了不用强转。...= end) { push_back(*first); first++; } } //拷贝构造可以复用上面利用迭代器构造 vector(vector& v)...,如果偶尔头插可以使用insert //要插入元素就会涉及扩容问题,所以要先实现扩容,要扩容就要判断容量,所以要给获取容量等函数 void reserve(size_t n) {

    40020

    vector容器!

    2、vector和普通数组区别: 不同之处在于数组是静态空间,而vector可以动态扩展。动态扩展它并不是在原空间之后持续新空间,而是找更大内存空间,然后将原数据拷贝到新空间,释放原空间。...二、vector构造函数 1、功能: 创建vector容器 2、函数原型: vectorv;//采用模板实现类,默认构造函数 vector(v.begin(),v.end());//将v[begin()...,end())区间中元素拷贝给本身,注意是左闭右开 vector(n,elem);//构造函数n个elem拷贝给本身 vector(const vector &vec);//拷贝构造函数 代码应用:...容量和大小: 1、功能描述: 对vector容器容量和大小进行操作 2、函数原型: empty();//判断容器是否为空 capacity();//容器容量 size();//返回容器中元素个数.../a.out num= 15 是txp,一个只专注于干货分享博主,有问题可以随时来撩哦!有故事,你有酒

    37430

    C++标准库类型vector

    头文件 #include using std::vector; 定义和初始化 vector常用初始化方法为: // 默认初始化: v不含任何元素, 但是只能添加类型T元素 vector...val); // 包含n个值为val元素 vector v1(n); // 包含n个执行了值初始化(内置类型初始化, 类类型默认构造函数初始化)元素 // 列表初始化 vector... v1 {a, b, c}; vector v1 = {a, b, c}; 注意vector圆括号与花括号初始化是不同:圆括号是通过调用vector构造函数进行初始化,如果使用了花括号那么初始化过程会尽可能会把花括号内值当做元素初始值列表来处理...如果初始化时使用了花括号但是提供值又无法用来列表初始化,那么就考虑用这些值来调用vector构造函数了。...找不到合适构造函数 std::vector v3(10, "tomocat"); // 10个string元素vector, 每个string

    1.2K10

    《C++Primer》第十三章 拷贝控制

    拷贝构造函数 如果一个构造函数第一个参数是自身类类型引用,且任何额外参数都有默认值,则此构造函数是拷贝构造。...voctor v1(10); // 正确: 直接初始化 vector v2 = 10; // 错误:接收大小参数构造函数是explicit 1.5 编译器可以绕过拷贝构造函数...,则该类默认构造函数被定义为删除 如果一个类由数据成员不能默认构造、拷贝、复制或者销毁,则对应成员函数将被定义为删除。...如果vector使用是拷贝构造函数并且发生异常,在新内存中构造元素时旧元素保持不变,这时候如果发生异常vector可以直接释放新分配(但还没构造成功)内存并返回。vector元素仍然存在。...为了避免这种潜在问题,vector除非直到元素类型构造移动函数不会发生异常,否则在重新分配内存过程中它就必须使用拷贝构造函数而不是移动构造函数

    1.6K40

    C++奇迹之旅:手写vector模拟实现与你探索vector 容器核心机制与使用技巧

    ) 3.或者我们也可以偷个懒,让编译器自己生成 //强制编译器生成默认构造函数 vector() = default; vector(const vector& v) 这个构造函数vector拷贝构造函数...value:表示每个元素初始值,默认值为 T(),即 T 类型默认构造值。 这个构造函数用于创建一个 vector 对象,并将其初始化为 n 个相同元素,每个元素值为 value。...对于内置类型(如 int, double),这通常是将其初始化为;对于用户定义类型(类或结构体),则会调用该类型默认构造函数。...总结: T() 在 const T& value = T() 中作用是提供一个默认值用于初始化 value 参数。这个默认值是通过调用 T 类型默认构造函数得到。...通过这个构造函数,你可以使用两个迭代器来初始化一个 vector 对象,将迭代器区间 [first, last) 中所有元素插入到 vector 中。

    13810

    C++ std::optional 使用教程

    为什么要引入 std::optional 觉得提出std::optional就是因为C++底层缺少None 这个表示,所以将std::nullopt和某种特定类型变量合并在一起构造成一个std::optional...这是一个寻找数组中第一个0元素函数: int findFirstNonZero(int arr[], int size) { for (int i = 0; i < size; i++)...3. std::optional 构造 std::optional 对象可以std::nullopt 或者{} 来构造,然后用emplace 函数来插入数值: // 1.0 采用 std::nullopt...std::optional对象为std::nullopt情况下设置默认值的话,可以用value_or 函数std::optional val9 = std::nullopt; std::...std::endl; // 输出 128 很明显,value_or函数默认值需要和optional对象类型一致,否则会编译报错。

    46941

    const成员函数一定是线程安全

    ::vector 型别对象中添加新元素,可能空间不够;即 std::vector 型别对象尺寸 size 和 其容量capacity相等时刻 此时,std::vector型别对象会分配一个新,更大内存块来存储其元素...//宗旨:多个线程同时调用带有 const 得成员函数,如何保证线程安全性 //const成员函数就一定是线程安全?...//宗旨:特种成员函数是指那些C++会自行生成成员函数 //C++98:默认构造函数,析构函数,复制构造函数,复制赋值运算符,public访问层级且是 inline //C++11: 新增两位成员...,移动构造函数和移动赋值运算符 //仅当一个类没有声明任何构造函数时,才会生成默认构造函数,只要指定了一个要求传参构造函数,就会阻止编译器生成默认构造函数 //https://www.cnblogs.com...,一个返回赋值返回参数 */ //1, 拷贝构造函数 class XML{ public: //默认构造函数: 不带任何参数,在没有定义其他构造函数情况下,编译器会自动生成默认构造函数

    1.1K20

    【Example】C++ 标准库常用容器全面概述

    所以本文表格是人脑补翻+审校。 如果有纰漏、模糊及时反馈。 了解每一种容器特性、知道什么情况下用什么容器就可以。 序列式容器 序列容器是指在逻辑上以线性排列方式存储给定类型元素容器。...vector 所用方式不在每次插入元素时,而只在额外内存耗尽时重分配。分配内存总量可用 capacity() 函数查询。额外内存可通过对 shrink_to_fit() 调用返回给系统。 ...(末尾元素)(const修饰) crbegin 返回一个指向vector中起始位置常量反向迭代器。(const修饰) crend 返回一个指向vector中末尾位置常量反向迭代器。...(末尾元素) erase 从指定位置删除vector一个元素或一系列元素。 front 返回回vector中第一个元素引用。...默认情况下,std::priority_queue 会选择值最大元素作为最高优先级。当然,也可以自定义值最小元素作为最高优先级。

    3.3K30

    C++相关基础知识总结笔记

    静态成员变量是否可以构造函数中初始化?不可以。静态成员变量在构造函数之前就已经初始化了。构造函数用于初始化对象静态成员变量,而静态成员变量在类所有对象创建之前就已经存在。...(无参,函数体为空) 3.默认拷贝构造函数, 对类中非静态成员属性简单值拷贝 如果用户定义拷贝构造函数,c++不会再提供任何默认构造函数 如果用户定义了普通构造(拷贝),c++不在提供默认无参构造,但是会提供默认拷贝构造访问权限...构造函数类型默认构造函数:不带任何参数构造函数。如果类中没有任何构造函数,编译器会自动生成一个默认构造函数。带参数构造函数:带有参数构造函数可以用来初始化对象成员变量。...如果基类没有默认构造函数,或者需要传递参数给基类构造函数可以在派生类构造函数初始化列表中显式调用基类构造函数构造函数规则如果类中定义了任何构造函数,编译器就不会自动生成默认构造函数。...如果类中定义了拷贝构造函数或移动构造函数,编译器就不会自动生成相应默认构造函数。如果类中定义了任何构造函数,但没有定义拷贝构造函数或移动构造函数,编译器会自动生成默认拷贝构造函数和移动构造函数

    10320

    C++:Vector模拟实现

    ,我们要去看看他源码到底有哪些成员变量        SGI下vector有三个成员变量,通过观察其他源码可以大致推断  _start是指向起始位置,_finish是指向有效数据下一个位置(迭代器都遵循左闭右开...通过这个我们可以观察到SGI版本下迭代器其实就是一个原生指针,value_type*类型相当于是模板T对应指针类型,有了这些大致了解,我们就可以去模拟实现啦!!...比如这个地方我们传string类迭代器  传vector迭代器  2.1.3 有参构造函数(对n个存储类型去调用他们构造) //有参构造函数(对n个存储类型去调用他们构造vector(...因为vector可能会存储内置类型,也可能会存储自定义类型,比如vector,所以如果我们没给值,缺省值就要给他默认无参构造函数,这个默认构造函数可以使用匿名对象。...,c11后是支持直接在成员变量那边给缺省值,所以们可以美化一下 全部代码 //无参构造函数 vector() {} //有参构造函数(对n个存储类型去调用他们构造vector

    8810

    【c++】set和map使用

    Compare:set中元素默认按照小于来比较 Alloc:set中元素空间管理方式,使用STL提供空间配置器管理 构造函数: (1):构造set (2):用[first, last)...因为std::mapinsert方法重载接收一个std::pair类型对象,编译器可以通过构造函数隐式类型转换,从提供两个值创建一个pair对象...如果e作为键在map中还不存在,map会使用默认构造函数创建一个对应int值(初始值为0),然后执行++操作将其值增加到1。...,键为k,并使用映射类型默认构造函数来初始化它值。...它返回一个包含两个迭代器 pair,这对迭代器分别代表键等于给定键元素序列开始和结束 当在普通multi)容器中使用 equal_range 时,返回范围包含个或一个元素

    4800

    【c++】vector模拟实现与深度剖析

    = T() 这部分声明了默认值,如果在调用函数时没有提供这个参数,就会使用它。T() 创建了 T 类型一个临时对象,这是通过类型默认构造函数完成。...这意味着如果没有提供具体 value 值时,构造函数将使用 T 类型默认构造一个新对象作为默认值。 例如,如果 T 是 int,那么 T() 就是 0。...如果 T 是某个类类型,并且该类有一个无参数构造函数,那么 T() 就会调用这个默认构造函数来创建一个新对象。...因此,这个参数声明使得构造函数可以具有灵活性:你既可以用特定初始值来构造 vector,也可以不提供初始值,让 vector 用类型 T 默认值来填充 vector(InputIterator first...这个构造函数可以用来构造一个 vector,使其包含现存容器(如另一个 vector、list 或 array)中某个子序列元素,或者任何由迭代器定义元素序列。

    9110

    C++编码优化之减少冗余拷贝或赋值

    临时变量 遇到一些临时变量情况有:stl vector 增长引起拷贝构造vector 赋值、std::sort 操作 1. vector增长 先简单介绍一下vector增长机制:每次push_back...那么我们完全可以使用vectorswap操作。它只是将两个vector指向空间等等信息交换了一下,而不会引起元素拷贝,它操作是常数级,和交互对象中元素数目无关。...使用gperftoolscpu profiler分析了一下数据,发现sort操作调用了元素拷贝构造和赋值函数,这才是消耗性能原因。...那么在对象交换时候,其实是没有必要调用拷贝构造函数和赋值函数std::swap默认实现),直接交换两个对象_content和_len值就好了。..._a = tmp; } } 因为调用堆精度问题和编译优化问题,有时候也可能分析不到 sort 是因为调用了元素对象拷贝构造和赋值函数所以才效率比较低。

    1.2K20

    C++ STL学习之【优先级队列】

    首先需要认识一下优先级队列 priority_queue 1.1、基本功能 优先级队列构造方式有两种:直接构造一个空对象 和 通过迭代器区间进行构造 直接构造一个空对象 #include <...} 注意: 默认比较方式为 less,最终为 优先级高值排在上面(大堆) 通过迭代器区间构造对象 #include #include #include...注: 现在实现是没有仿函数版本 优先级队列基本框架为 #pragma once #include namespace Yohifo { //默认底层结构为 vector...private: Container _con; //其中成员变量为底层容器对象 }; } 默认构造函数:显式调用底层结构默认构造函数 //默认构造函数 priority_queue()...答案是没必要,通过 仿函数 可以轻松解决问题,这也是本文重点内容 2.3、仿函数使用 仿函数又名函数对象 function objects,仿函数主要作用是 借助类和运算符重载,做到同一格式兼容所有函数

    23320
    领券