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

为什么不调用移动构造函数?(默认情况下只有构造器,没有其他内容)

移动构造函数是一种特殊的构造函数,用于在对象之间进行资源的转移而不是复制。它通过将源对象的资源所有权转移到目标对象,从而提高了性能和效率。

在默认情况下,不调用移动构造函数的原因可能是因为以下几点:

  1. 对象的资源不可移动:某些对象可能包含不可移动的资源,例如文件句柄、网络连接等。在这种情况下,移动构造函数是不适用的,因为资源的所有权无法转移。
  2. 对象的资源可以共享:如果对象的资源可以被多个对象共享,那么复制资源的代价可能比移动资源更低。在这种情况下,调用移动构造函数可能会导致资源的不必要复制,从而降低性能。
  3. 对象的资源不足以产生性能提升:在某些情况下,对象的资源规模较小或者复制资源的代价较低,调用移动构造函数可能无法带来明显的性能提升。在这种情况下,使用移动构造函数可能是不必要的。

需要注意的是,是否调用移动构造函数取决于具体的应用场景和对象的设计。在一些情况下,移动构造函数可以显著提高性能和效率,特别是在处理大规模数据或者频繁进行对象拷贝的情况下。因此,在设计和实现对象时,需要综合考虑资源的所有权转移、资源的复制代价以及性能需求等因素,来决定是否调用移动构造函数。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Metaverse):https://cloud.tencent.com/product/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一文入魂:妈妈再也不用担心我不懂C++移动语义了!

(二)默认情况下,我们拥有一切 我们知道,在C++11之前,如果我们定义一个空类,编译会自动为我们生成构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。该特性在移动语义上得以延伸。...,执行编译默认生成的构造函数MyClass B{ A }; // OK,执行编译默认生成的拷贝构造函数MyClass C{ std::move(A) }; // OK,执行编译默认生成的移动构造函数...五、使用移动语义时需要注意的其他内容 在最后一节,我们聊聊与移动语义相关的一些额外内容。...因此,编译会启用NRVO,直接让myClass对象使用对象A。这样一来,在整个过程中,我们只有一次创建对象A时构造函数调用开销,省去了拷贝构造函数以及析构函数调用开销: 为NRVO点赞!...因此,当返回局部对象时,我们不用画蛇添足,直接返回对象即可,编译会优先使用最佳的NRVO,在没有NRVO的情况下,会尝试执行移动构造函数,最后才是开销最大的拷贝构造函数

1.2K20

Google C++ 编程风格指南(三):类

若未声明构造函数, 则编译会生成一个默认构造函数, 这有可能导致某些成员未被初始化或被初始化为恰当的值. 定义: new 一个不带参数的类对象时, 会调用这个类的默认构造函数....这么做的原因是: 如果你没有提供其它构造函数, 又没有定义默认构造函数, 编译将为你自动生成一个. 编译生成的构造函数并不会对对象进行合理的初始化....对于用户定义的类型, 移动操作一般是通过移动构造函数移动赋值操作符实现的. 拷贝 / 移动构造函数在某些情况下会被编译隐式调用. 例如, 通过传值的方式传递对象....如果某区段没内容, 可以声明....译者 (YuleFox) 笔记 不在构造函数中做太多逻辑相关的初始化; 编译提供的默认构造函数不会对变量进行初始化, 如果定义了其他构造函数, 编译不再提供, 需要编码者自行提供默认构造函数; 为避免隐式转换

81140
  • 《C++Primer》第十五章 面向对象程序设计

    必须要搞清楚的是,动态绑定只有当我们通过指针或者调用函数时才会发生,也只有在这种情况下对象的动态类型才能可能与静态类型不同。 2....只有当一个类没有定义任何自己版本的拷贝控制成员,且类的每个static数据成员都可以移动时,编译才会为它合成移动构造函数或者移动赋值运算符。 3....在实际编程中,如果基类中没有默认、拷贝或移动构造函数,那么一般情况下派生类也不会定义相应的操作。 5....移动操作与继承 前面提到,大多数基类都会定义一个虚析构函数,因此在默认情况下基类通常包含合成的移动操作,而且在派生类中也没有合成的移动操作。...类不能继承默认、拷贝和移动构造函数。如果派生类没有直接定义这些构造函数,则编译将为派生类合成它们。

    1.2K20

    如何设计一个C++的类?

    类需要自己写构造函数和析构函数吗? 反正我每次定义一个类的时候都会明确把构造函数和析构函数写出来,即便它是空实现,即便我写编译也会视情况默认生成一个,自动生成的称为默认构造函数。...但我不想依赖编译,也建议大家不要过度依赖编译,明确写出来构造函数和析构函数也是一个好习惯,多数情况下没有那么简单,多数情况下编译默认生成的构造函数和析构函数不一定是我们想要的。...tips:编译在某些情况下会生成移动构造函数移动赋值运算符,但记住这些情况太麻烦了,建议手动控制,明确要的时候就自己写一个,明确不要的时候就delete掉。...什么是默认构造函数?看下百度百科的定义: 默认构造函数(default constructor)就是在没有显式提供初始化式时调用构造函数。...如果你期望在某个成员函数更改成员函数,而又没有标记为const,这时自己或者其他人在此函数内改动了某些成员变量,编译对此没有任何提示,这就有可能产生潜在的bug。

    1.5K20

    【C++】C++11 右值引用和移动语义

    为什么右值不能取地址:在 C++中,右值则是一个临时使用的、不可寻址的内存值;右值没有独立的内存空间,它只是存储在寄存其他临时内存空间中的一个值;我们也不能把右值放入内存中,因为右值没有确定的内存位置...,所以 C++11 为每个类新增的两个默认成员函数,即移动构造函数移动赋值运算符重载;它们的生成规则如下: 移动构造:如果析构函数 、拷贝构造、赋值重载这三个默认成员函数你都没有实现,那么编译会自动生成一个默认移动构造...默认生成的移动构造函数,对于内置类型成员会完成浅拷贝,对于自定义类型,如果其实现了移动构造,就调用它的移动构造,如果没有实现就调用它的拷贝构造。...移动赋值:移动赋值和移动构造的规则一样,如果析构函数 、拷贝构造、赋值重载这三个默认成员函数你都没有实现,那么编译会自动生成一个默认移动赋值运算符重载。...默认生成的移动赋值函数,对于内置类型成员会完成浅拷贝,对于自定义类型,如果其实现了移动赋值,就调用它的移动赋值,如果没有实现就调用它的赋值重载。

    73910

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

    struct 默认权限为 public , class 默认权限为 private 类的构造相关 默认情况下,c++编译至少为我们写的类增加3个函数 : 1.默认构造函数(无参,函数体为空) 2.默认析构函数...如果派生类的构造函数没有显式调用基类的构造函数,那么编译会自动调用基类的默认构造函数(如果有的话)。...如果基类没有默认构造函数,或者需要传递参数给基类构造函数,可以在派生类的构造函数初始化列表中显式调用基类的构造函数构造函数的规则 如果类中定义了任何构造函数,编译就不会自动生成默认构造函数。...如果类中定义了拷贝构造函数移动构造函数,编译就不会自动生成相应的默认构造函数。...如果类中定义了任何构造函数,但没有定义拷贝构造函数移动构造函数,编译会自动生成默认的拷贝构造函数移动构造函数构造函数的应用场景 初始化成员变量:确保对象在使用前处于有效状态。

    17520

    C++11『右值引用 ‖ 完美转发 ‖ 新增类功能 ‖ 可变参数模板』

    ,类中共有八个天选之子(编译默认生成) 天选之子 的意思就是 即使我们写,编译也会默认生成(有条件) 之前六个 天选之子 的生成规则这里就不再阐述了,主要来说说 移动语义 相关的两个函数 移动语义就是通过右值引用将资源转移再利用...,对于自定义类型,会去调用它的 移动构造 函数,如果没有,就调用 拷贝构造(目的:涉及深拷贝的类编译期望我们自己设计 移动构造 函数移动赋值 的生成逻辑与上面一致 编译为什么会这么要求?...核心在于 与临界资源(将亡值)交换资源 默认生成的 移动构造 或者 移动赋值 并非没有用,就像 拷贝构造 一样,默认生成的拷贝构造会去调用函数中涉及类的 拷贝构造,也就是说,只要底层类没问题,自动生成的函数也可以实现...在想让编译生成的函数之后加上 default 关键字,如果类中涉及 动态内存管理(比如这里的 string),是推荐使用默认生成函数的,因为会涉及到 深拷贝 并且由于 移动构造 属于 构造 家族,移动赋值...移动构造 这里想强调的是 default 可以指定编译自动生成类中的默认成员函数 能否使用 default 生成除默认成员函数之外的其他成员函数

    43250

    3.类和对象(中)

    类的默认成员函数 默认成员函数就是用户没有显式实现,编译会自动生成的成员函数称为默认成员函数(就是我们写,编译默认生成一份)。...一个类,我们写的情况下编译默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解一下即可。...有三个默认构造函数:无 参构造函数、全缺省构造函数、我们构造时编译默认生成的构造函数,都叫做默认构造函数。但是 这三个函数有且只有一个存在,不能同时存在。...要注意很多同学会认为默认构造函数是编译默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结一下就是传实参就可以调用构造都叫默认构造。 7....我们写,编译默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。

    7010

    详细c++必修:类和对象(二)

    ⼀个类,我 们写的情况下编译默认⽣成以下6个默认成员函数 其中前四个用的比较频繁,我们一定要做到熟练使用。 C++11以后还会增加两个默认成员函数移动构造移动赋值。我们不做讲解。...其中写自动生成的看编译,有可能初始化为0,也有能是随机值(上图编译环境是vs2022,是随机值) ⽆参构造函数、全缺省构造函数、我们构造时编译默认⽣成的构造函数,都叫做默认构造函...比特就业课 ⽆参构造函数、全缺省构造函数、我们构造时编译默认⽣成的构造函数,都叫做默认构造函 数。但是这三个函数有且只有⼀个存在,不能同时存在。...我们写,编译默认⽣成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始 化是不确定的,看编译。对于⾃定义类型成员变量,要求调⽤这个成员变量的默认构造函数初始 化。...我们在主函数调用。其中Stack类中有指针指向的空间,所以必须写析构,但是MyQueue类中却不用写。 这是为什么? 因为编译默认⽣成MyQueue的析构函数调⽤了Stack的析构。

    800

    2020最全Java面试题--基础篇

    11.假设我们在传递任何参数的情况下运行Java类。 Main方法中参数的String数组的值是什么? 默认情况下,Java中参数的String数组的值为空。...构造函数是一个特殊的函数,具有与类名相同的名称。 没有构造函数,就没有其他方法可以创建对象。 默认情况下,Java为每个对象提供默认构造函数。...如果我们重载了一个构造函数,那么必须实现这个默认构造函数。 5. 为什么Java类中需要默认构造? 如果没有定义其他构造函数,则默认构造函数是Java会自动生成的无参构造函数。...根据Java规范,如果类中没有重载的构造函数,它将提供一个默认构造函数。但这并没有说明在类中编写重载构造函数的情况。 我们至少需要一个构造函数来创建一个对象,这就是Java提供默认构造函数的原因。...Java中的默认构造返回的值是什么? 当我们用Java调用构造函数时,它返回由它创建的对象。 这就是我们用Java创建新对象的方式。 7. 我们能继承构造函数吗?

    57731

    C ++ 中不容忽视的 25 个 API 错误设计!

    因此,如果你的类只包含简单的数据类型,并且你计划使用隐式生成的移动构造函数,那么如果你定义复制构造函数则不可能。在这种情况下时,你必须显式定义移动构造函数。...为什么这是一个错误? 如果该构造函数破坏其强大的异常安全保证,则STL容器只能在其调整大小操作中使用移动构造函数。...将API标记为noexcept有多种分歧,包括某些编译优化,例如移动构造函数的优化。...错误#6:不将单个参数构造函数标记为显式 为什么这是一个API设计错误? 允许编译进行一次隐式转换以将参数解析为函数。...这意味着编译可以使用可用* single argument*调用构造函数将一种类型转换为另一种类型,以获得正确的参数类型。

    1.5K20

    【Modern C++】深入理解移动语义

    如果开发人员没有显示定义移动构造函数移动赋值运算符,那么编译也会生成默认。...与其他四个特殊成员函数不同,编译生成默认移动构造函数移动赋值运算符需要,满足以下条件: 如果一个类定义了自己的拷贝构造函数,拷贝赋值运算符或者析构函数(这三者之一,表示程序员要自己处理对象的复制或释放问题...),编译就不会为它生成默认移动构造函数或者移动赋值运算符,这样做的目的是防止编译生成的默认移动构造函数或者移动赋值运算符不是开发人员想要的 如果类中没有提供移动构造函数移动赋值运算符,且编译不会生成默认的...,那么我们在代码中通过std::move()调用移动构造或者移动赋值的行为将被转换为调用拷贝构造或者赋值运算符 只有一个类没有显示定义拷贝构造函数、赋值运算符以及析构函数,且类的每个非静态成员都可以移动时...,编译才会生成默认移动构造函数或者移动赋值运算符 如果显式声明了移动构造函数移动赋值运算符,则拷贝构造函数和拷贝赋值运算符将被 隐式删除(因此程开发人员必须在需要时实现拷贝构造函数和拷贝赋值运算符

    83110

    现代C++之容器

    建议在接口中使用const string&,除非确知调用者已经持有 string:如果函数里不对字符串做复杂处理的话,使用 const char* 可以避免在调用只有 C 字符串时编译自动构造 string...如果需要改变调用者的字符串内容,使用 string& 作为参数类型(通常推荐)。...2.vector 2.1 异常安全性 vector 通常保证强异常安全性,如果元素类型没有提供一个保证抛异常的移动构造函数,vector 通常会使用拷贝构造函数。...因为 stack(queue)为保证强异常安全性,如果元素类型没有提供一个保证抛异常的移动构造函数, 通常会使用拷贝构造函数。...pop作用是释放元素,c++98设计时还没有移动构造的概念,所以如果返回成员,必须要调用拷贝构造函数,这时分配空间可能出错,导致构造失败,要抛出异常,所以没必要返回成员。

    1K10

    认真理一理C++的构造函数

    默认构造函数 如果没有定义任何构造函数,编译会为我们提供无参的默认构造函数。但是有例外 如果定义了自己的构造函数,编译也不会提供默认构造函数。...如果类中某个成员它自己没有默认构造函数(无参构造函数),那么编译也就不能合成默认构造函数。...,但是没有无参构造函数;一个Test,没有定义构造函数,准备让编译生成默认的。...,这会被编译认为是一个函数的声明,因此要用下面的方式: Test test; 禁止拷贝形式的初始化 在没有其他限制的情况下,对于只有一个实参的构造函数而言,可以使用拷贝形式的初始化,即在初始化test...总结 关于构造函数内容还有很多,在介绍继承,多态,拷贝,移动内容后再展开,本文总结如下: 构造函数没有返回值 构造函数名与类名相同 构造函数可以重载 构造函数不能被声明成const 对于只有一个实参的构造函数而言

    55420

    第 13 章 拷贝控制

    当一个类没有定义这些拷贝控制成员时,编译会自动地定义缺失的操作,但编译定义的版本的行为可能并非我们所想。 拷贝构造函数,第一个参数是自身类类型的引用,且任何额外参数都有默认值的构造函数。...如果类的某个成员的析构函数是删除或不可访问的,或是类有一个没有类内初始化的引用成员,或是类有一个没有类内初始化且无法默认构造的 const成员,则该类的默认构造函数被定义为删除的。...移动构造函数,第一个参数是该类类型的一个右值引用,而其他额外参数都必须有默认实参。移动构造函数不分配任何新内存,接管对象的内存。...抛出异常的移动构造函数移动赋值运算符的声明和定义处都必须指定 noexcept。 移动赋值运算符也必须检查自赋值情况,因为此右值可能是 move调用自身返回的结果。...只有当一个类没有定义任何自己版本的拷贝控制成员,且它的所有非 static数据成员都能移动构造移动赋值时,编译才会为它合成移动构造函数移动赋值运算符。

    99650

    类和对象 _ 剖析构造、析构与拷贝

    ,放开后报错:error C2512: “Date”: 没有合适的默认构造函数可用 Date d1; return 0; } 在C++中,如果你没有为类显式定义任何构造函数,编译会为你自动生成一个默认的无参构造函数...这个默认构造函数不会执行任何操作,也不会初始化类的成员变量。这意味着,如果你的类Date没有显式定义任何构造函数,那么你可以创建一个Date对象而不提供任何参数,编译会为你调用这个默认构造函数。...因此,在尝试这样创建对象时,编译会报错,因为它找不到一个合适的默认构造函数调用。错误信息表明编译找不到一个可以调用构造函数,因为没有默认构造函数可用。...拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译直接报错, 因为会引发无穷递归调用。...在一些情况下默认的拷贝构造函数会有危害: 当类中存在指针成员时,编译默认的拷贝构造函数只会复制指针的值,而不会复制指针所指向的内容

    11610

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

    拷贝构造函数在几种情况下都会被隐式地使用,因此拷贝构造函数通常不应该是explicit的。 1.1 合成拷贝构造函数 当我们没有为一个类定义拷贝构造函数时,编译会为我们定义一个。...参数和返回值 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化 当一个函数具有非引用的返回类型时,返回值会被用来初始化调用方的结果 拷贝构造函数被用来初始化非引用类类型参数,这一特性解释了为什么拷贝构造函数自己的参数必须是引用类型...,或是类有一个const的或引用成员,则类的合成拷贝构造函数被定义为删除的 如果类的某个成员的析构函数是删除的或不可访问的,或是类有一个引用成员,他没有类内初始化,或是类有一个const成员,他没有类内初始化且未显式定义默认构造函数...只有但那个一个类没有定义任何自己版本的拷贝控制成员,并且它的所有非static数据成员都可以移动时,编译才会为它合成移动构造函数或者移动赋值运算符。...如果一个类有一个拷贝构造函数但是未定义移动构造函数,编译不会合成移动构造函数。这种情况下函数匹配规则保证该类型的对象会被拷贝,即使我们试图通过调用move来移动他们。

    1.6K40

    【C++】C++11的新特性 --- lambda表达式 ,新的类功能,模块的可变参数 , emplace系列接口

    默认成员函数就是我们写编译会生成一个默认的!...注意只有写了任意一个构造函数构造,拷贝构造,拷贝赋值)就不生成默认构造 在C++11之后,加入了右值引用和移动语义,就产生了新的类默认成员函数移动构造移动赋值。...针对移动构造函数移动赋值运算符重载有一些需要注意的点如下: 如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任意一个。那么编译会自动生成一个默认移动构造。...默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调用移动构造没有实现就调用拷贝构造。...默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。

    9310

    深入理解C++中的move和forward!

    其实这里是可以优化的: 临时变量其实最终都是要被回收的,如果能把临时变量的内容直接“移入”成员变量中,此时就不需要调用复制构造函数了!...,此时是没有调用复制构造函数的!...即:我们需要在自己的类中实现移动语义,避免深拷贝,充分利用右值引用和std::move的语言特性。 实际上,通常情况下C++编译默认在用户自定义的class和struct中生成移动语义函数。...此外还需要注意: 如果我们没有提供移动构造函数,只提供了拷贝构造函数,std::move()会失效但是不会发生错误,因为编译找不到移动构造函数就去寻找拷贝构造函数,这也是拷贝构造函数的参数是const...,另一个调用移动构造函数

    1.9K10
    领券