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

在什么情况下,C++11 = default构造函数不同于不带参数和空主体的构造函数?

C++11中的= default构造函数与不带参数和空主体的构造函数在以下情况下有所不同:

  1. 默认构造函数被显式删除(= delete)时,= default构造函数可以重新启用默认构造函数。例如,当类中存在其他构造函数,但我们仍希望使用默认构造函数时,可以使用= default来声明默认构造函数。
  2. 当类中存在其他用户自定义的构造函数时,= default构造函数可以用来生成默认构造函数。这样做可以避免手动编写默认构造函数的代码,提高代码的可读性和可维护性。
  3. 当类中存在其他成员变量需要进行初始化时,= default构造函数可以自动初始化这些成员变量。如果不使用= default构造函数,需要手动编写构造函数来初始化这些成员变量。

总结起来,= default构造函数可以在需要重新启用默认构造函数、需要自动生成默认构造函数或需要自动初始化成员变量的情况下与不带参数和空主体的构造函数有所不同。

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

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送、移动分析、移动测试等):https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云虚拟专用网络(VPC):https://cloud.tencent.com/product/vpc
  • 腾讯云安全产品(云防火墙、DDoS防护、Web应用防火墙等):https://cloud.tencent.com/product/safety
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++11-列表初始化变量类型推导范围forfinal&override默认成员函数控制

相比较而言,C++11能更好地用于系统开发库开发、语法更加泛华简单化、更加稳定安全,不仅功能更强大,而且能提升程序员开发效率 二、列表初始化 背景引入: C++98中,标准允许使用花括号...//Pointer p( 1, 2 ); return 0; } 多个对象列表初始化 多个对象想要支持列表初始化,需要实现initializer_list类型参数构造函数...C++中对于类编译器会生成一些默认成员函数,如果在类中显式定义了,编译器将不会重新生成默认版本 有时候这样规则可能被忘记,最常见是声明了带参数构造函数,必要时则需要定义不带参数版本以实例化无参对象...而且有时编译器会生成,有时又不生成,容易造成混乱,于是C++11让程序员可以控制是否需要编译器生成 显式缺省函数 C++11中,可以默认函数定义或者声明时加上=default,从而显式指示编译器生成该函数默认版本...,用=default修饰函数称为显式缺省函数 示例: class A { public: A(int a) : _a(a) {} // 显式缺省构造函数,由编译器生成 A() = default

69460

什么是三法则

问题 维基上是这么解释 三法则 ,那么, 复制对象是什么意思? 复制构造函数赋值运算符有什么区别? 什么时候需要声明定义它们? 怎么禁止对象被复制?...一是person b(a),调用复制构造函数已存在对象基础上再构造一个对象;二是b = a,调用赋值运算符, 在上述代码中,我们既没有定义复制构造函数,也没有定义赋值运算符(也没有定义析构函数)...隐式生成析构函数,在这个例子中也恰当,因为构造函数中并没有定义任何需手动管理资源。...成员变量析构函数Person析构函数完成后会隐式调用: 执行析构函数主体并销毁主体中分配所有自动对象之后,类 X 析构函数就会调用 X 直接成员变量析构函数。...(不幸是,C++ 标准编译器并没有强制这套规则,如果强制了的话,程序员犯错会更少。) 五法则 从 C++11 开始,特殊成员函数大家庭又新加入了两名成员:移动构造函数移动赋值运算符。

57520

C++11知识点总结(全面解析C++11经常考到知识点)

默认成员函数控制 C++中对于类编译器会生成一些默认成员函数,比如:构造函数、拷贝构造函数、运算符重载、析构函数&const&重载、移动构造、移动拷贝构造函数。...有时候这样规则可能被忘记,最常见是声明了带参数构造函数,必要时则需要定义不带参数版本以实例化无参对象。...8.1 显式缺省函数 C++11中,可以默认函数定义或者声明时加上=default,从而显式指示编译器生成该函数默认版本,用=default修饰函数称为显式缺省函数。...返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。 {statement}:函数体。函数体内,除了可以使用其参数外,还可以使用所有捕获到变量。...注意: lambda函数定义中,参数列表返回值类型都是可选部分,而捕捉列表函数体可以为。 因此C++11中最简单lambda函数为:[]{}; 该lambda函数不能做任何事情。

2K10

c++11新特性,所有知识点都在这了!

:搞定c++11新特性std::functionlambda表达式 模板改进 C++11关于模板有一些细节改进: 模板右尖括号 模板别名 函数模板默认模板参数 详细介绍请看:C++11模板改进...for循环 cout << "i" << endl; } 委托构造函数 委托构造函数允许同一个类中一个构造函数调用另外一个构造函数,可以变量初始化时简化操作,通过代码来感受下委托构造函数妙处吧:...nullptr nullptr是c++11用来表示指针新引入常量值,c++中如果表示指针语义时建议使用nullptr而不要使用NULL,因为NULL本质上是个int型0,其实不是个指针。...void func() override { cout << "derived" << endl; } }; default c++11引入default特性,多数时候用于声明构造函数为默认构造函数...A a; // 编译出错 return 0; } 上面代码编译出错,因为没有匹配构造函数,因为编译器没有生成默认构造函数,而通过default,程序员只需函数声明后加上“=default;”,

17.7K22

C++11新关键字

5.constexpr 5.1简介 constexprC++11中用于申明常量表达式(const expression),可作用于函数返回值、函数参数、数据申明以及类构造函数等。...: (a)构造函数体必须为; (b)初始化列表只能使用常量表达式。...5.3 constexpr与const区别 const可以修饰函数参数函数返回值、函数本身、类等,不同使用场景下,const具有不同意义,不过大多数情况下,const描述是“运行时常量性”,...(args)<<endl; //函数参数数目 } 9.defaultdelete[8]^{[8]}[8] 9.1default 我们知道,C++98C++03编译器类中会隐式地产生四个函数:默认构造函数... C++11 中,被称为 “特殊成员函数还有两个:移动构造函数移动赋值运算符函数。如果用户申明了上面六种函数,编译器则不会隐式产生。

3K10

C++11——引入新关键字

1.auto auto是旧关键字,C++11之前,auto用来声明自动变量,表明变量存储栈,很少使用。C++11中被赋予了新含义作用,用于类型推断。...6.2override 假如我们继承基类函数重写虚函数时写错了,参数类型不对或个数不对,但是编译没问题,造成了对基类同名函数隐藏,运行时候设计不一样,override就是辅助检查是否正真重写了继承函数...(args)<<endl; //函数参数数目 } 8.defaultdelete[8]^{[8]} 8.1default 我们知道,C++98C++03编译器类中会隐式地产生四个函数:默认构造函数...、拷贝构造函数、析构函数赋值运算符函数,它们被称为特殊成员函数。... C++11 中,被称为 “特殊成员函数还有两个:移动构造函数移动赋值运算符函数。如果用户申明了上面六种函数,编译器则不会隐式产生。

1.4K50

c++11面试宝典(final,delete,deault,explicit,lambda表达式)

3. delete default C++11扩展了deletedefault用法,可以用来控制默认成员函数生成与不生成 delete C++11扩展了delete用法,可以让用户控制让编译器不生成默认成员函数...default C++11中,可以默认函数定义或者声明时加=default,从而显式指示编译器生成该函数默认版本,用=default修饰函数称为显式缺省函数 4.explicit...与普通函数参数列表一致,如果不需要参数传递,则可以连同()一起 省略 mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。...返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。 {statement}:函数体。函数体内,除了可以使用其参数外,还可以使用所有捕获到变量。...注意: lambda函数定义中,参数列表返回值类型都是可选部分,而捕捉列表函数体可以为

54620

深入分析C++对象模型之移动构造函数

那么什么情况下才会合成出来移动构造函数呢?...编译器合成移动构造函数条件编译器只有以下这些情况下才会合成出来移动构造函数:类中没有定义拷贝构造函数、拷贝赋值运算符、析构函数;且:类定义中有一个类类型成员,这个类成员定义了移动构造函数;或者...,C++11标准为了兼容C++98,同样地也允许合成出来,但是对于移动构造函数移动赋值运算符,C++11标准中明确规定了:只要定义了析构函数,编译器便不再合成出移动构造函数移动赋值运算符。...移动操作并未使效率更高情况某些情况下,移动构造函数或移动赋值运算符被正确地合成出来或者由程序员定义出来了,但是程序却并未如预期提升运行效率,如以下场景:没有移动操作假如类中有了移动构造函数(合成或者用户定义...另一种情形,如std::array容器,它是C++11标准新提供容器类型,功能相当于内建数组,它不同于别的容器类型将数据存储堆中,然后使用指针指向数据,移动容器只需赋值指针,然后将源指针置即可。

20221

C++11新特性学习笔记

,或者派生类是从基类中虚继承,那么不能继承构造函数 l 一旦使用继承构造函数,编译器不会再为派生类生成默认构造函数 4.2 委托构造 继承构造函数类似,委托构造函数也是C++11中对C++构造函数一项改进...err , 构造函数 X(int, int) 非 X 特殊成员函数 X(int = 1) = default; // err , 默认构造函数 X(int=1) 含有默认参数 }; “=default...可变参数模板 C++11之前,类模板函数模板只能含有固定数量模板参数C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。...有了右值引用转移语义,我们设计实现类时,对于需要动态申请大量资源类,应该设计转移构造函数转移赋值函数,以提高应用程序效率。...可以对动态资源进行管理,保证任何情况下,已构造对象最终会销毁,即它析构函数最终会被调用。

2.2K20

【C++】深入剖析C++11新特性

所以出于清晰安全角度考虑,C++11中新增了nullptr,用于表示指针。...默认成员函数就是我们不写编译器会生成一个默认C++11 新增了两个:移动构造函数移动赋值运算符重载。...3.强制生成默认函数关键字default C++11可以让你更好控制要使用默认函数。假设你要使用某个默认函数,但是因为一些原因这个函数没有默认生成。...mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数)。 ->returntype:返回值类型。...函数体内,除了可以使用其参数外,还可以使用所有捕获到变量。 注意: lambda函数定义中,参数列表返回值类型都是可选部分,而捕捉列表函数体可以为

32740

C++11新特性学习笔记

,或者派生类是从基类中虚继承,那么不能继承构造函数 l 一旦使用继承构造函数,编译器不会再为派生类生成默认构造函数 4.2 委托构造 继承构造函数类似,委托构造函数也是C++11中对C++构造函数一项改进...err , 构造函数 X(int, int) 非 X 特殊成员函数 X(int = 1) = default; // err , 默认构造函数 X(int=1) 含有默认参数 }; “=default...可变参数模板 C++11之前,类模板函数模板只能含有固定数量模板参数C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。...有了右值引用转移语义,我们设计实现类时,对于需要动态申请大量资源类,应该设计转移构造函数转移赋值函数,以提高应用程序效率。...可以对动态资源进行管理,保证任何情况下,已构造对象最终会销毁,即它析构函数最终会被调用。

2K20

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

总结 初始化概念:创建变量时赋予它一个值(不同于赋值概念) 类构造函数控制其对象初始化过程,无论何时只要类对象被创建就会执行构造函数 如果对象未被用户指定初始值,那么这些变量会被执行默认初始化...C++98/03与C++11列表初始化 C++98/03中,普通数组POD(Plain Old Data,即没有构造、析构函数类或结构体)类型可以使用花括号{}进行初始化,即列表初始化。...Cat() { std::cout << "default constructor of Cat" << std::endl; } // 接受一个参数构造函数...初始化习惯 尽管C++11将列表初始化应用于所有对象初始化,但是内置类型习惯于用等号初始化,类类型习惯用构造函数圆括号显式初始化,vector、mapset等容器类习惯用列表初始化。...C++11引入了std::initializer_list,允许构造函数或其他函数参数一样使用初始化列表,这才真正意义上为类对象初始化与普通数组 POD 初 始化方法提供了统一桥梁。

2.5K10

如何设计一个C++类?

反正我每次定义一个类时候都会明确把构造函数析构函数写出来,即便它是实现,即便我不写编译器也会视情况默认生成一个,自动生成称为默认构造函数。...但我不想依赖编译器,也建议大家不要过度依赖编译器,明确写出来构造函数析构函数也是一个好习惯,多数情况下类没有那么简单,多数情况下编译器默认生成构造函数析构函数不一定是我们想要。...什么是默认构造函数?看下百度百科定义: 默认构造函数default constructor)就是没有显式提供初始化式时调用构造函数。...它由不带参数构造函数,或者为所有的形参提供默认实参构造函数定义。如果定义某个类变量时没有提供初始化时就会使用默认构造函数。...什么时候使用explict避免隐式转换? explict多数情况下用于修饰只有一个参数构造函数,表示拒绝隐式类型转换。那什么时候使用explict关键字呢,还是看情况。

1.5K20

C++11】移动赋值 | 新类功能 | 可变参数模板

移动赋值 C++11中,string中operator= 包含 参数为右值版本 ---- C++98中 没有移动赋值移动构造 ,只有参数为左值 赋值重载(operator=)拷贝构造 -...新功能 C++11中新增 了 移动构造函数 移动赋值运算符重载 移动构造 若没有实现移动构造,并且没有实现析构函数、拷贝构造、拷贝赋值重载中任意一个 (若实现了其中任意一个,则说明是深拷贝类...移动构造 都是完成浅拷贝 ---- 对于自定义类型成员 _name,因为yzq命名空间string类中存在 移动构造,所以调用 其移动构造 ---- 刚调试执行到s1时,s3实际上空间为 当调试执行到...C++11中,不期望被拷贝,(拷贝会涉及缓冲区等问题) ---- 默认成员函数,如果不写会默认生成,加入delete后可禁止生成 3.可变参数模板 可变参数模板 :可以接受可变参数函数模板类模板...) 带有形参test函数中调用无参test函数,进行换行 ---- 当有两个参数ab时,将a传给test作为第一个参数val,将b传给test作为第二个参数 参数包 当test函数内部再次调用

15450

【C++】C++11——新类功能|default、delete|可变参数模板|emplace

新增加了两个默认成员函数:移动构造函数移动赋值运算符重载 移动构造函数移动赋值运算符重载生成: 如果没有自己实现移动构造函数:并且没有实现析构函数、拷贝构造拷贝赋值重载中任意一个,那么编译器就会自动生成一个默认移动构造函数...C++11允许类定义时给成员变量初始缺省值,默认生成构造函数会使用这些缺省值初始化,这个我们对象就有说过了。...1.强制生成默认函数关键字default C++11可以更好控制使用默认函数。...可变参数模板是C++11新增特性之一,能够让我们创建可以接收可变参数函数模板类模板 1.可变参数函数模板 可变参数模板定义: template void ShowList...先给可变参数函数模板增加一个模板参数class T,从接收参数包中把第一个参数分离出来 函数模板中递归调用该函数模板,调用时传入剩下参数包 直到递归到参数包为,退出递归。

19630

C++进阶:C++11(列表初始化、右值引用与移动构造移动赋值、可变参数模版...Args、lambda表达式、function包装器)

右值引用场景与意义 我们先来回顾一下左值引用意义——解决了什么问题 传参拷贝问题:函数调用时,如果参数是通过值传递(传值)方式传递,会导致参数拷贝构造函数被调用,增加了额外开销。...这里就能使用完美转发 完美转发是 C++11 引入一个特性,用于函数模板中保持参数值类别(左值或右值)常量性,同时将参数原样传递给另一个函数。...(默认移动赋值跟上面移动构造完全类似) 如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造拷贝赋值 4.2关键字default与delete 强制生成默认函数关键字default...比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以使用default关键字显示指定移动构造生成 禁止生成默认函数关键字delete: 如果能想要限制某些默认函数生成,C++98中,是该函数设置成...因此,C++11语法中出现了Lambda表达式 6.2lambda表达式 C++中,Lambda表达式是一种匿名函数(本质是一个局部匿名函数对象),可以需要函数对象地方使用,例如作为参数传递给标准算法函数

5800

Chapter 3: Moving to Modern C++

::initializer_lists构造函数重载解析同时出现时容易造成错误调用 调用构造函数时候,只要不涉及到std::initializer_list参数,括号花括号初始化有相同含义...,使用花括号初始化时,编译器会强烈地偏向于调用使用std::initializer_list参数重载构造函数 class Widget { public: Widget(int...std::initializer_list构造函数时,此时调用花括号初始化,编译器会解析为调用默认构造函数,而要解析成std::initializer_list构造函数,需要在花括号中嵌套一个花括号进行初始化...基类派生类函数const属性必须一致 基类派生类函数返回类型以及异常说明必须兼容 函数引用修饰必须一致(C++11) 限制成员函数使用只能是左值或者右值(*this) class Widget...constexpr函数使用了运行时值,它们就会产生运行时值,但是如果constexpr函数使用所有参数都是运行时值,那么就会报错 C++11中,constexpr函数只能包含不超过一条return

1.8K60

【C++】C++11 新特性

{ 10, 20, 30 }; return 0; } ps:需要注意区分列表初始化两种不同场景: 当列表中元素类型元素个数符合构造函数参数要求时,会直接调用构造函数来完成初始化; 当列表中元素个数不符合构造函数参数要求时...,又能表示整形常量;所以出于清晰安全角度考虑,C++11中新增了关键字 nullptr,用于表示指针。...赋值,不包括容器适配器: ---- 十、类新功能 C++11变化主要分为如下几个方面: 增加了两个默认成员函数 – 移动构造移动赋值; 类成员变量允许使用缺省值进行初始化; 增加 default...mutable:默认情况下,lambda 函数总是一个 const 函数,mutable 可以取消其常量性;(注意:使用该修饰符时,参数列表不可省略,即使参数);但实际上 mutable 很少用,因为形参改变不会影响实参...注意: lambda 函数定义中,参数列表返回值类型都是可选部分,即可以省略不写,同时捕捉列表函数体也可以为,因此 C++11 中最简单 lambda 函数为:[]{}; 但该 lambda

1.3K10

初始化|这些年踩过

,提高代码可读性可维护性,同时减少了某些特殊情况下可能出现二义性。...(括号中传入参数),对于不需要参数则不能添加括号,否则编译器会认为是函数声明 foo f1; // default initialization foo f2(42, 1.2);...编译器有个特点,对于以花括号初始化方式则认为是统一初始化,如果构造函数中同样存在std::initializer_list为参数构造函数,那么则优先调用: class MyClass { public...(以intdouble作为参数构造函数),但由于存在以std::initializer_list参数作为参数构造函数重载,因此该构造函数将是首选。...)默默执行,而开发人员则认为它正在使用第一个构造函数,emm,后果不堪设想~~ 在上面提了,编译器会优先调用参数为std::initializer_list构造函数,但是有个例外: class MyClass

16510
领券