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

当我显式地将构造函数作为参数调用时,未调用移动构造函数

当显式地将构造函数作为参数调用时,未调用移动构造函数是指在调用构造函数时,没有使用移动构造函数来创建对象的副本。

构造函数是用于创建对象的特殊成员函数,它在对象被创建时被调用。移动构造函数是一种特殊的构造函数,用于在对象的移动语义下创建对象的副本,以提高性能和效率。

在C++中,当我们显式地将构造函数作为参数调用时,通常会使用拷贝构造函数来创建对象的副本。拷贝构造函数是用于创建对象的副本的特殊成员函数。它会将一个已存在的对象的值复制到新创建的对象中。

未调用移动构造函数可能是因为以下几种情况:

  1. 没有定义移动构造函数:如果在类的定义中没有显式地定义移动构造函数,编译器将使用默认的拷贝构造函数来创建对象的副本。
  2. 不适用移动构造函数:在某些情况下,编译器可能会决定不使用移动构造函数,而是使用拷贝构造函数来创建对象的副本。这可能是因为对象的移动语义不适用于特定的情况,或者编译器认为使用拷贝构造函数更安全或更合适。
  3. 显式地调用拷贝构造函数:如果在显式地调用构造函数时使用了拷贝构造函数的语法,而没有使用移动构造函数的语法,那么就不会调用移动构造函数。

需要注意的是,移动构造函数通常在对象的右值语义下使用,即在对象将要被销毁或移动的情况下。它可以通过使用std::move()函数来显式地调用。

总结起来,当显式地将构造函数作为参数调用时,未调用移动构造函数可能是因为没有定义移动构造函数、不适用移动构造函数或者显式地调用了拷贝构造函数。在实际开发中,根据具体的情况选择适当的构造函数来创建对象的副本。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 )

博客总结 : " 拷贝构造函数 " 又称为 " 赋值构造函数 " , 该类型构造函数有 4 种调用时机 ; ① 使用一个对象初始化另外一个对象 : 使用 一个 类实例对象 初始化 另外一个 类实例对象...; // 使用一个对象初始化另外一个对象 // 直接手动 调用拷贝构造函数 Student s2 = Student(s1); ② 一个对象赋值给另外一个对象 : 一个 类实例对象 赋值给...另外一个 类实例对象 ; // 一个对象赋值给另外一个对象 // 自动调用拷贝构造函数 Student s2 = s1; ③ 对象值作为函数参数 : 类的实例对象 以值的方式 传递给函数 , 不是以...对象值作为参数 void fun(Student s) { } 如果调用函数 , 需要拷贝实参 , 实参的副本值 , 也就是对象值 传递给函数形参 , 这个过程需要调用 Student 类的 拷贝构造函数...; 然后 , 创建的实例对象 传递给 fun 函数 , 传递时由于传递的是 对象值 , 需要拷贝对象副本 , 拷贝副本时会自动调用 Student 类的 拷贝构造函数 ; 调用参数构造函数 调用拷贝构造函数

18520

JavaScript中的this指向问题

函数调用中的 this:当函数作为一个方法调用时,this 指向调用该方法的对象。...this的隐绑定 this的隐绑定是指在函数作为对象的方法调用时,this会隐绑定到该对象上。这种绑定方式可以让我们在方法内部引用对象自身的属性和方法。...当一个函数作为对象的方法调用时,this会被隐绑定到该对象上,使得函数内部可以通过this来访问该对象的属性和方法。...this的显示绑定 绑定是指在函数调用时明确指定函数内部的this值。绑定可以通过以下三种方法实现: 使用call方法:call()方法允许我们调用一个函数,并且设置this的值。...回函数中的this:当一个函数作为参数传递给另一个函数,并在内部函数中使用this时,this的指向可能会变化。

22160

说说这个this啊

当一个函数调用时,会创建一个活动记录(也称为执行上下文)。这个记录会包含调用栈,函数调用方法,传入的参数等信息。this就是记录的其中一个属性,会在函数调用时用到。...,1000ms后函数推入事件队列,然后检查主线程即调用栈是否为空,如果为空,队列里的函数按照先入先出原则push到调用栈,想了这么多呢,我发现我确实想多了,this在回里,ojbk,输出1。.../吐口水 /吐口水,其实前面说回里的this绑定的全局对象,有点武断,文章刚开始,就说了,这取决于函数调用时的各种条件。...new 如果函数或者方法调用之前带有关键字new,它就构成构造函数调用,也就是new绑定。 构造函数通常不使用return关键字,它们通常初始化新对象,当构造函数函数体执行完毕时,它会返回。...);//{a:2} 如果构造函数使用return语句但没有指定返回值,或者返回一个原始类型的值,那么这时忽略返回值,同时使用这个新对象作为调用结果 123456 function A(){ this.a

83290

《Effective Modren C++》 进阶学习(上)

6. auto推导若非己愿,使用类型初始化惯用法 auto在推导时,可能返回的是引用类型,可能导致引用的对象被修改。因此在使用时,需要格外注意,可以通过初始化来规避此类问题。...作为对比,使用有参数构造函数。 Widget w1(10); // 没问题,使用实参10调用Widget的一个构造函数 需要初始化一个无参数构造函数对象时,会变成函数声明。...另外,在构造函数参数情况中,若不包含std::initializer_list参数或者 构造传入实参,()和{}产生一样的效果,否则{}优先匹配std::initializer_list参数构造函数...而 nullptr 的类型是 std::nullptr_t,与整数类型有差异,可以指定指针的空值,避免重载解析歧义。 nullptr看起来更舒服^_^。 9....如果类没有声明析构函数,则会生成默认的析构函数,执行成员的析构操作。 「拷贝构造函数(Copy Constructor)」 自动生成的拷贝构造函数执行的是浅拷贝,即逐个成员变量的进行拷贝。

17120

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

第十三章 拷贝控制 简介 当定义一个类时,我们或者隐指定此类型对象拷贝、移动、赋值和销毁时做什么。...拷贝构造函数在几种情况下都会被隐使用,因此拷贝构造函数通常不应该是explicit的。 1.1 合成拷贝构造函数 当我们没有为一个类定义拷贝构造函数时,编译器会为我们定义一个。...使用=default 我们可以通过拷贝控制成员定义为=default来要求编译器生成合成的版本。 6....1.3 标准库move函数 虽然不能将一个右值引用直接绑定到一个左值上,但我们可以通过move一个左值转移到对应的右值引用类型。...当我们希望在vector重新分配内存这类情况下对我们自定义类型的对象进行移动而不是拷贝,就必须告诉标准库我们的移动构造函数不会发生异常,可以安全使用。

1.6K40

【笔记】《C++Primer》—— 第三部分:类设计者的工具

13 拷贝控制 拷贝构造函数会自动每个非static成员依次拷贝到正在创建的对象中,其中内置类型会直接拷贝,数组会被逐元素拷贝,类类型会调用拷贝构造函数来拷贝 如果初始化值要求一个explicit...但我们可以const左值引用绑定到右值上 移动构造的具体写法类似拷贝构造,但是构造参数是自己类型的右值引用,为了完成移动构造,我们需要保证移动后源对象处于可以无害销毁的状态,源对象的指针不再指向原先的资源...当我们需要调用递增递减运算符时,我们需要对后置版本的参数传递一个任意int值,这样编译器才能区分出版本 重载函数调用运算符让我们可以像使用函数一样使用类的对象,称为函数对象,函数对象常常用作泛型算法的实参...与函数模板与普通非模板函数不太一样,编译器通常不对实参进行类型转换从而只有几个类型转换会应用在实参上,编译器偏向于生成新的模板实例来适配 如果指定了实参类型,那么就可以自动正常进行类型转换 有时我们需要使用编译确定下的参数类型来作为返回值的类型...,那些可变的参数部分称为参数包,由省略号...标记 可变参数的模板函数通常是一种递归函数,一般我们编写的时候都会递归分析包中的内容并调用直到终止,包中的内容分解成元素称为包扩展 包扩展的一种用法是用来扩展提取输入的参数

1.7K10

【c++】类与对象(中)

而在c++中编译器会自动为类生成6个默认成员函数。 默认成员函数:用户没有实现,编译器会生成的成员函数称为默认成员函数。...一旦用户定义,编译器将不再生成。 构造函数其特征如下: 函数名与类名相同,且无返回值。 对象实例化时编译器自动调用对应的构造函数构造函数可以重载。...而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。 析构函数名是在类名前加上字符 ~。 无参数无返回值类型。 一个类只能有一个析构函数。若定义,系统会自动生成默认的析构函数。...也就是说当我们使用传值调用时会产生一个临时变量来拷贝传入的值,而这一步拷贝又需要调用拷贝构造函数,所以就会引发无穷调用。...若定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。 4.1什么时候需要自己写拷贝构造函数

12510

C++类自动提供的特殊成员函数

默认构造函数: 如果提供任何构造函数,c++会自动生成默认构造i函数。创建对象时会调用。...⽤于初始化过程中(包括按值传递参数)。 原型: ```c++ Class_name(const Class_name&); ``` 它接受⼀个**指向类对象的常量引⽤**作为参数。...例如:StringBad(const StringBad&); 新建⼀个对象并将其初始化为同类现有对象时,复制构造函数都将被⽤。最常⻅的情况是新对象 初始化为现有的对象。...**编译器⽣成临时对象时,也将使⽤复制构造函数。** 由于按值传递对象⽤复制构造函数,因此应该按引⽤传递对象。这样可以节省构造函数的时间以及存储新对象的空间。...//当调用析构函数产生问题,可能对同一块内存区域进行两次删除,这将导致程序异常终止。 ``` - 解决方案:定义一个复制构造函数

69410

C++:51---继承中的构造函数、析构函数、拷贝控制一系列规则

一旦定义了自己的移动操作,那么它必须同时定义拷贝操作(因为如果不定义,合成的拷贝操作会被删除,详情见对象移动:https://blog.csdn.net/article/details/6) 例如...:下面是一个基类,其中定义了移动操作。...(std::move(d)) //别忘记移动基类成员 { //在函数体内移动本类成员 } }; 派生类赋值运算符 与拷贝和移动构造函数一样,派生类的赋值运算符页必须为其基类部分赋值: 例如: class...,但是 //我们还必须给出一个构造函数,且为基类进行构造,否则不能创建Bulk_quote对象 Bulk_quote() :Disc_quote("Word", 1, 2, 3) { cout <...这些构造函数按照正常规则被合成。继承的构造函数不会被作为用户定义的构造函数来使用。因此,如果一个类只含有继承的构造函数,则它也拥有一个合成的默认构造函数

1.3K30

Unity基础教程系列(九)——形状行为(Modular Functionality)

抽象方法必须用Abstract关键字定义。 ? 此外,行为作用于形状,因此我们添加一个作为参数。这样我们就不用用域来记录了。 ?...构造函数方法调用是最好的例子,但是我也认为AddComponent;已经足够了。 使用组件来隔离行为的好处是,我们可以在不需要它们时将其省略。这样我们就可以避免一些不必要的工作。...最直接的方法是行为作为参数的公共AddBehavior方法,该方法将其添加到列表中。该方法必须在组件添加到形状的游戏对象之前或之后调用。 ?...最后,我们可以从Shape.GameUpdate中删除旧代码,而以自身作为参数调用其所有行为的GameUpdate方法。这将使形状移动并再次旋转。 ?...相反,我们必须通过调用该类型的默认构造函数方法来创建一个常规对象实例。 ? 尽管在未定义构造函数方法的情况下,类仍然具有隐公共默认构造函数方法,但这不能保证它们的一定存在。

1.3K40

带你真正了解 JavaScript 中的 this

当一个函数调用时,创建一个活动记录(也称执行上下文对象),此记录对象包含函数调用栈、调用方式、传入参数等信息,this 是这个记录的一个属性。...硬绑定降低了函数的灵活性,无法再使用隐绑定或绑定修改 this。...ps:js 的许多内置函数都提供了可选参数,用来实现绑定上下文对象,例:数组的 forEach、map、filter 等方法,第一个参数为回函数,第二个为绑定的上下文对象。...实际上 js 中并不存在构造函数,只有对于函数构造调用。...使用 new 调用函数(构造调用) 时, 执行函数; 创建一个全新对象(若返回其他对象时,那么 new 表达式中的函数调用会自动返回这个新对象,若返回了其他对象,则 this 绑定在返回的对象上);

44540

剖析【C++】——类与对象(中)——小白篇—超详解

参数,无返回值类型。 一个类只能有一个析构函数。若定义,系统会自动生成默认的析构函数。析构函数不能重载。 对象生命周期结束时,C++编译系统自动调用析构函数。...拷贝构造函数参数只有一个且必须是类类型对象的引用。使用传值方式编译器会报错,因为会引发无穷递归调用。 若定义,编译器会生成默认的拷贝构造函数。...若定义,编译器会生成默认的拷贝构造函数,对内置类型进行浅拷贝,对自定义类型调用其拷贝构造函数完成拷贝。对于涉及资源管理的类,定义拷贝构造函数以实现深拷贝是必要的,以防止资源泄漏。..."调用默认构造函数" << std::endl; } 当我们创建对象时,构造函数会被调用。...例如: Date date1(2024, 5, 28); // 调用参数构造函数 Date date3; // 调用默认构造函数 2.2 拷贝构造函数 拷贝构造函数用于创建一个新的对象作为已有对象的副本

9310

你不知道的this(2)

举例来说,思考一下Number(..)作为构造函数时的行为,ES5.1 中这样描述它: Number 构造函数 当 Number 在 new 表达式中被调用时,它是一个构造函数:它会初始化新创建的对象...使用"new"来调用函数,或者说发生构造函数调用时,会自动执行下面的操作。...隐绑定和绑定哪个优先级更高?...被忽略的this 如果你把null或者undefined作为this的绑定对象传入call、apply或者bind,这些值在调用时会被忽略,实际应用的是默认绑定规则: function foo() {...间接引用 另一个需要注意的是,你有可能(有意或者无意)创建一个函数的“间接引用”,在这种情况下,调用这个函数会应用默认绑定规则。

49710

JavaScript 设计模式学习第二篇-关于this、new、bind、call、apply

函数的指向有以下几种场景: 1. 作为构造函数被 new调用; 2. 作为对象的方法使用; 3. 作为函数直接调用; 4. 被 call、apply、bind 调用; 5....箭头函数中的 this; 1.1. new 绑定 函数如果作为构造函数使用 new 调用时, this绑定的是新创建的构造函数的实例。...绑定 通过 call、apply、bind 我们可以修改函数绑定的 this,使其成为我们指定的对象。通过这些方法的第一个参数我们可以绑定 this。...,且在调用函数时,将给定参数列表作为函数参数序列的前若干项。...绑定:函数是否是通过 bind、call、apply调用?如果是的话,this 绑定的是指定的对象; 3. 隐绑定:函数是否在某个上下文对象中调用

27610

JavaScript忍者秘籍

(handler) 浏览器的事件轮询是单线程(single-threaded)的 3.回概念 当我们定义一个函数稍后执行时,无论何时定义,在浏览器执行还是其他地方执行,我们定义的就是所谓的回(callback...当一个函数被赋值给对象的一个属性,并使用引用该函数的这个属性进行调用时,那么函数就是作为该对象的一个方法进行调用函数作为对象的一个方法(method)进行调用时,该对象就变成了函数上下文,并且在函数内部可以以...this参数的形式进行访问 5.作为构造器进行调用 函数作为构造器(constructor)进行调用,我们要在函数调用前使用new关键字 6.构造器的超能力 创建一个新的空对象 传递给构造器的对象是this...参数,从而成为构造器的函数上下文 如果没有的返回值,新创建的对象则作为构造器的返回值进行返回 7.构造器编码注意事项 函数和方法名通常以动词开头,并且是小写字母开头;构造器通常是描述所构造对象的名词...例如,匿名函数保存在一个变量里,将其作为一个对象的方法,或者是匿名函数作为一个回 2.函数编程专注于:少、通常无副作用、函数作为程序代码的基础构件块 B.递归 1.内联函数(inline function

96610

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

前者基类通常将其定义为虚函数virtual,当我们使用指针或者引用调用函数时,该调用将被动态绑定 任何构造函数之外的非静态函数都可以是虚函数 如果基类把一个函数声明成虚函数,那么该函数在派生类中隐也是虚函数...,后者又使用(合成的)Quote拷贝构造函数 在我们的Quote继承体系中,所有类都使用合成的析构函数,其中派生类隐使用而基类通过将其虚析构函数定义成=default而显使用 由于Quote因为定义了析构函数而不能拥有合成的移动操作...; // 删除的拷贝构造函数 // 因为我们定义了拷贝构造函数,所以编译器不会为B合成一个移动构造函数 }; class D : public B { // 没声明任何构造函数 }...// 要想使用拷贝或移动构造函数,我们必须在构造函数初始值列表中调用构造函数 D(const D& d) : Base(d) // 拷贝基类成员 /..... */ } } 与拷贝或者移动构造函数一样,派生类的赋值运算符也必须为其基类部分赋值: // Base::operator=(const Base&)不会被自动调用 D &D::operator

1.2K20

JavaScript中的this指向哪?

绑定当函数作为对象的方法被调用时,隐绑定规则会将this绑定到调用该方法的对象,也就是"谁调用,就指向谁"。...这些参数按照顺序传递给函数,并在调用函数作为函数参数使用功能: 返回原函数 function 的拷贝, 这个拷贝的 this 指向 thisArgvar test = { fun: function...函数作为参数传递函数作为参数传递到新函数中,并在新函数中执行该参数函数:var lostObj3 = { name: "lostObj3", fun: function(){ console.log...实际上也相当于赋值给变量后调用这种情况,而且 doFun()作为独立函数调用,所以其 this 也就指向全局对象了回函数如果将对象方法作为函数传递给其他函数,this 绑定也可能丢失var lostObj4...,使用默认绑定规则,this 指向 window当函数作为对象方法被调用,使用隐绑定规则,this 指向这个对象当函数作为构造方法时,使用 new 绑定规则,this 指向返回的对象apply/call

13210

【C++】类和对象 (中篇)

,而是由编译器自动调用;而构造函数的功能其实就是我们之前Init函数的功能; 这里有两个需要注意的地方: 1、构造函数虽然支持重载和缺省参数,但是无参构造和有参全缺省构造不能同时出现,因为在调用时会产生二义性...; 同时,当参数有多个时可以构成很多个重载,使得构造函数变得十分冗余,所以一般我们只会定义一个全缺省的构造函数,因为这一种就可以构造就可以代表很多种参数情况; 2、当我调用无参构造或者全缺省构造来初始化对象时...~ (表示与构造函数功能相反);; 无参数无返回值; 一个类只能有一个析构函数,若定义,系统会自动生成默认的析构函数;(注意:析构函数不能重载) 对象生命周期结束时,C++编译系统系统自动调用析构函数...,因为会引发无穷递归调用; 若定义,编译器会生成默认的拷贝构造函数; 默认的拷贝构造函数对内置类型以字节为单位直接进行拷贝 – 浅拷贝,对自定义类型调用其自身的拷贝构造函数; Date 类的拷贝构造...; 1、构造函数 构造函数完成对象的初始化工作,由编译器在实例化对象时自动调用; 默认构造函数是指不需要传递参数构造函数,一共有三种 – 编译器自动生成的、定义且无参数的、定义且全缺省的;

65200

【重学 C++】06 | C++该不该使用 explicit

使用explicit关键字修饰类的构造函数,禁止隐类型转换后,在进行类型转换时必须指定转换操作。...隐转换合理使用场景拷贝构造函数移动构造函数对于拷贝构造函数移动构造函数,我们通常希望它们能够在需要时自动调用,以便进行对象的拷贝和移动操作。...如果explicit应用于拷贝构造函数移动构造函数,将会禁止编译器自动调用这些构造函数。...Foo对象,在函数调用时,会触发拷贝构造函数,但由于拷贝构造函数定义为 explicit,编译器无法隐调用拷贝构造函数。...如果MyClass的构造函数标记为explicit,则在创建obj对象时,需要调用构造函数,如MyClass obj({1, 2, 3, 4, 5});。

20700
领券