C++11的问题:类的默认移动构造函数会做什么?

类默认的移动构造函数是否是这样:

  • 如果是简单值、静态数组、指针,就复制
  • 无视指针指向的内容
  • 如果是直接的对象,就调用其移动构造函数

是这样吗?

是否意味着,假如类及其成员的类都未写移动构造函数,那么当需要移动的时候,实际效果与默认拷贝构造函数是一样的?

c++

1个回答

没有实现移动构造,移动拷贝函数,就不能利用移动的优势,主要是性能的提升

但是C++11中的STL等模板库已经支持移动了,所以你的程序即使不改,当你使用vector,list等这些时,也会可能受益到移动构造函数带来的性能优化

oyljerry
oyljerry 回复srhouyu: 主要的收益是当你把一个vector赋值给另一个vector的时候
接近 3 年之前 回复
srhouyu
srhouyu 感谢。 如果往vector中push的对象中只有几个float成员,那么有没有可能从移动中获益呢? 例如这样: class Point { float x,y; }; std::vector<float> v; Point p; v.push_back(std::move(p)); 这种情况下,有获益的可能吗?
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C++ 11新特性:移动构造函数和移动赋值操作符
移动构造函数 在C++11中新加入的特性! 在上一篇blog中我加入了一张图,可以具体看到移动构造函数的运行原理。 此时,我们偷走了临时变量的内存空间,据为己用。节省了开辟空间的时间。 [cpp] view plaincopy A(A && h) : a(h.a)   {       h.a = null
默认移动构造函数
我认为编译器合成的默认构造函数完成的
C++11学习9---移动构造函数
主要讲的是如何实现移动构造。 1.移动构造的原因 这个移动构造,或者移动拷贝赋值,有窃取资源的意思。 这个窃取资源时对于指针持有的资源来说的。 而这个窃取是通过在构造函数与重载拷贝赋值的时候,编码将当前的指针指向资源,再将原来的指针,指向nullptr实现的。 当然,你也可以不对指针这样使用,比如对于任意的类型,将其拷贝给现在的,再将原来的置为空值。 但是这样没有意义,因为相对于很大的
[C++11] 默认构造函数
类通过一个特殊的构造函数来控制默认初始化过程,这个函数就是默认构造函数,默认构造函数无需任何实参。我们可以显示的定义默认构造函数也可以让编译器为我们生成默认构造函数。默认构造函数以如下规则初始化累的数据成员: 如果存在类内初始值,用它来初始化成员。否则,默认初始化该成员。 class Sales_data { public: std::string bookNo; unsign
【C\C++学习】之十八、C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)
在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符。我就斗胆将他们命名为六大函数好了。 一、构造函数 c++primer中说过:构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数。构造函数的工作就是保证每个对象的数据成员具有合适的初始值。 构造函数与其他函数不同:构造函数和类同名,没有返回类型。 构造函
C++类的特殊成员-默认/拷贝/移动构造函数
详细讲解类的默认构造函数,拷贝/移动构造函数,以及拷贝赋值和移动赋值等操作。
c++11 中的移动构造函数
在现实中有很多这样的例子,我们将钱从一个账号转移到另一个账号,将手机SIM卡转移到另一台手机,将文件从一个位置剪切到另一个位置……移动构造可以减少不必要的复制,带来性能上的提升。 l  C++11标准中提供了一种新的构造方法——移动构造。 l  C++11之前,如果要将源对象的状态转移到目标对象只能通过复制。在某些情况下,我们没有必要复制对象——只需要移动它们。 l  C++11引入移动语义
移动构造-C++11
移动构造: 移动构造是C++11标准中提供的一种新的构造方法。 在现实中有很多这样的例子,我们将钱从一个账号转移到另一个账号,将手机SIM卡转移到另一台手机,将文件从一个位置剪切到另一个位置……     移动构造可以减少不必要的复制,带来性能上的提升。 有些复制构造是必要的,我们确实需要另外一个副本;而有些复制构造是不必要的,我们可能只是希望这个对象换个地方,移动一下而已。 在C++11
C++11中的继承构造函数
C++11中的继承构造函数
C++11 新特性之右值引用和转移构造函数
问题背景 [cpp] view plaincopy #include        using namespace std;       vectorint> doubleValues (const vectorint>& v)   {       vectorint> new_values( v.size() );       f
移动构造函数和移动赋值运算符
为了直观地观察移动构造函数和移动赋值运算符的运行方式,编写一个类Pointer,该类的对象会在堆动态创建一个数组,因此移动构造函数和移动赋值运算符是很有必要的,因为可以避免深度复制,提高效率。
C++编译器会自动生成哪些函数
C++编译器会自动生成哪些函数 构造函数拷贝构造函数析构函数赋值函数 如何不想要上面那些编译器自动生成的函数 比如我想实现单例模式 传统方法 将构造函数声明成private类型:为何声明成了private后就能实现单例模式呢 C++11做法 C++引入了两个指示符:delete和defaultdelete:告诉编译器不自动产生这个函数default
什么情况下C++编译器会生成默认的构造函数
问题:对c++初学者来说存在一个误区,如果类没有定义任何构造函数,编译器会自动生成默认的构造函数。   注意:这种说法是错误的。 正确的说法:惟有默认构造函数”被需要“的时候编译器才会合成默认构造函数。 那什么情况下是“被需要”的时候? 以下有四种情况编译器会自动合成默认构造函数 情况1 含有类对象数据成员,该类对象类型有默认构造函数 即:一个class含有类对
C++11中继承构造函数和委派构造函数
1、继承构造函数 在C++继承中,我们可能会遇到下面这个例子 class Base { public: Base(int va) :m_value(va) { } Base(char c) :m_c(c) { } private: int m_value; char m_c; }; class Derived :public Base { private: pu
c++什么时候会生成默认构造函数
C++对象可以使用两种方式进行创建:构造函数和复制构造函数。假如我们定义了类A,并使用它创建对象。 代码如下: A a,b; A c=a; A d(b); 对象a和b使用编译器提供的默认构造函数A::A()创建出来,我们称这种创建方式为对象的定义(包含声明的含义)。对象c和d则是使用已有的对象,通过编译器提供的复制构造函数A::A(const A&)创建,我们称这种创建方式为
C++学习笔记18,C++11中的初始化列表构造函数(二)
C++11中的初始化列表构造函数(Initialize_list Constructors)是将std::initializer_list作为第一个参数的构造函数,并且没有任何其他参数(或者其他参数具有默认值)。例如: #include #include //必须包含该头文件 #include using namespace std; class A { private: vector m
c++11 类默认函数的控制:"=default" 和 "=delete"函数
#define _CRT_SECURE_NO_WARNINGS #include &amp;lt;iostream&amp;gt; #include &amp;lt;string&amp;gt; #include &amp;lt;vector&amp;gt; #include &amp;lt;map&amp;gt; //c++11 类默认函数的控制:&quot;=default&quot; 和 &quot;=delete&quot;函数 /* C++ 的类有四类特殊成员函数,它们分别是:默认构...
c++的默认拷贝构造函数,从深度拷贝和浅拷贝说起
1. c++类的默认拷贝构造函数的弊端c++类的中有两个特殊的构造函数,(1)无参构造函数,(2)拷贝构造函数。它们的特殊之处在于: (1)当类中没有定义任何构造函数时,编译器会默认提供一个无参构造函数且其函数体为空; (2)当类中没有定义拷贝构造函数时,编译器会默认提供一个拷贝构造函数,进行成员变量之间的拷贝。(这个拷贝操作是浅拷贝)这里只讲拷贝构造函数。在c语言中,int a = 5; /
C++11学习笔记2---右值引用与移动构造函数
1.引入原因 (1)拷贝构造函数为什么使用常量引用 因为在函数的实参与形参的传递之中,对于很大的对象,如果使用值传递会耗费大量时间与资源。 如果只是传递引用就会好很多。所以使用引用。 我们不希望通过这个引用去改变参数原来的值,所以使用常量引用(const &)。 但是有时我们有希望,还是需要定义创建与传入的参数相同却又是独立的存储空间的对象。 这个时候我们可以在拷贝构造函数里面
C++11标准之后的移动构造函数和复制构造函数探究
如下一个类的定义,其定义了类的复制构造函数,和移动构造函数class B { public: B() :data(0) //默认构造函数 { cout << "Default constructor is called." << endl; } B(int i) :data(i) //带参数的构造函数 { cou
Java默认构造函数的作用
转载自:http://blog.csdn.net/sun93732/article/details/6147424 class Person { private String name=""; private int age=0; public Person() {    System.out.println("person无参数构造函数"); } public Pe
C#中结构和类的默认构造函数
不想看我废话直接看这个链接就行:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/new-operator研究这个的起因还是C#的类的字段可以赋值初始化,而在C++中是不行的(除了const static int(枚举)这种成员变量),原因是类声明时并未分配空间,而后查了一些资料才得知这是C#编译器...
C++笔记之移动构造函数何时会被调用,何时不会被调用
下面这段文字是C++ primer中的一段文字: 为了理解他,我们来看这样一段代码: Test.h 文件: #pragma once #include #include using namespace std; class Test { public: Test(const string& s = "hello world") :str(new string(s)) { cou
C++ 默认构造函数的重要性
1、默认构造函数 C++ 默认构造函数是对类中的参数提供默认值的构造函数,一般情况下,是一个没有参数值的空函数,也可以提供一些的默认值的构造函数,如果用户没有定义构造函数,那么编译器会给类提供一个默认的构造函数,但是只要用户自定义了任意一个构造函数,那么编译器就不会提供默认的构造函数,这种情况下,容易编译报错,所以正确的写法就是用户在定义构造函数的时候,也需要添加一个默认的构造函数,这样就不会造
C++11--移动构造函数
class A_2 { public: A_2() :m_ptr(new int(0)) { } ~A_2() { delete m_ptr; } private: int* m_ptr; }; A_2 Get(bool flag) { A_2 a; A_2 b; if (flag) return a; else return b; } int righ...
关于”类‘customer’中不存在默认构造函数“的问题
关于”类‘customer’中不存在默认构造函数“的问题,我是之前在类中声明定义了一个带参数的构造函数,如下: 但是报错如下:   解决方法:         添加一个不带参数的构造函数即可。
C++基础:缺省构造函数
缺省构造函数是C++以及其他的一些面向对象的程序设计语言中,
c++编译器何时会生成默认构造函数
转自:点击打开链接 默认的构造函数是指为所有参数都提供了默认值的构造函数,通常是指无参的构造函数。比如下面的类Test,它的默认构造函数就是Test()。 class Test { public: Test(){} // default constructor } ; 如果你没有为你的类提供任何构造函数,那么编译器将自动为你生成一个默认的无参构造函数。一旦你为你的类定义了构造
C++11新标准的阻止拷贝方案
C++11新标准下,可以通过将拷贝构造函数和拷贝赋值运算符定义为删除的函数(deleted function)来阻止拷贝。删除的函数是这样一种函数:我们虽然声明了他们,但是不能以任何形式使用他们。 通过在参数列表后面加上=delete来指出。程序: /***********************/ // @file nocopy.cc // @author lesliefish(yu
《深入理解C++11》笔记-默认函数的控制
在C++中声明自定义的类之后,编译器会默认生成一些成员函数,这些函数被称为默认函数。包括构造函数、拷贝构造函数、拷贝赋值构造函数、移动构造函数、移动拷贝函数、析构函数。另外,编译器还会默认生成一些操作符函数,包括operator ,、operator &amp;amp;amp;amp;amp;、operator &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;、operator 、operator -&amp;amp;amp;amp;gt;、operator -&amp;
【C++11新特性】 C++11智能指针之shared_ptr
C++中的智能指针首先出现在“准”标准库boost中。随着使用的人越来越多,为了让开发人员更方便、更安全的使用动态内存,C++11也引入了智能指针来管理动态对象。在新标准中,主要提供了shared_ptr、unique_ptr、weak_ptr三种不同类型的智能指针。接下来的几篇文章,我们就来总结一下这些智能指针的使用。今天,我们先来看看shared_ptr智能指针。
关于默认构造函数的几个错误认识(四种情况下,编译器会生成默认构造函数)
书上提到没有定义构造函数时进行显式初始化成员,我很纳闷,不是说没有定义构造函数的时候会合成默认构造函数吗,自己查了下,果然查到了一下转载的内容:不是未定义构造函数就一定会合成默认构造函数的!        转自:http://www.cppblog.com/chenglong7997/articles/169731.html        假期间闲来无事,就下载了某大师的VC++视频资
浅谈c/c++中类的拷贝构造函数和重载赋值函数
拷贝构造函数   拷贝构造函数,顾名思义,在拷贝的过程中进行构造类对象。首先看一个例子进行理解。 一个例子 8 #include<iostream> 10 using namespace std; 11 12 class copyconstructor 13 { 14 static int objectCount; 15 public: 16 c
C++ 移动构造与移动赋值运算符
一,为何需要移动语义? 我们定义了下面这个Useless类 class Useless{ private: string name; char *p; public: Useless(); Useless(string name); Useless(const Useless &f); Useless operator+(const Useles
关于使用C++11中委托构造函数
今天在读《C++Primer》时读到委托构造函数一节,书中关于委托构造函数是这样描述的: 一个委托构造函数使用它所属的类的其他构造函数执行自己的初始化过程,或者说它把自己的一些(或者全部)职责委托给了其他构造函数。和其他构造函数一样,一个委托构造函数也有一个成员初始值的列表和一个函数体。在委托构造函数内,成员的初始值列表只有一个唯一的入口,就是类名本身。和其他成员初始值一样,类名后面紧跟圆括号括
java 构造函数默认修饰符
java 构造器权限分析
C/C++面试题:构造函数与析构函数
构造函数与析构函数的一道小题下面程序的输出是什么?#include<iostream>using namespace std;class TestClass{ char x; public: TestClass() { cout << 'A'; } TestClass(char c) { cout << c; } ~TestClass() { cout << 'B';
c++ 11 多线线程系列-----thread
一、与 C++11 多线程相关的头文件 C++11 新标准中引入了四个头文件来支持多线程编程,他们分别是 ,,,和。 :该头文主要声明了两个类, std::atomic 和 std::atomic_flag,另外还声明了一套 C 风格的原子类型和与 C 兼容的原子操作的函数。:该头文件主要声明了 std::thread 类,另外 std::this_thread 命名空间也在该头文
为类模板加上构造函数和默认构造函数
#include #include using namespace std; template class Test { public:     Test();     Test(T1 d1, T2 d2);     template Test(const Test &t);     void SetData1(T1 val)     {         data1
C++ primer 当vector中的push_back遇到移动构造函数会发生什么
首先仔细阅读 C++ primer 第五版 P474 Note下面的一段话意思是说当我们在类中定义了移动构造函数的时候,假设这个移动构造函数是noexcept的,类似对应StrVec类的操作,vector可能会重新分配内存,也就是说会将元素从旧空间移动到新内存中去。这个过程中就会发生移动构造函数注意 这里要注意一点,C++11规定的是移后源对象是一定要处于可析构的状态,意思是说移后源对象有可能执行
相关热词 c# oracle 开发 c#选择字体大小的控件 c# usb 批量传输 c#10进制转8进制 c#转base64 c# 科学计算 c#下拉列表获取串口 c# 如何防止参数被修改 c#开发微信公众号例子 c# null