在C+11中,对于defaulted函数,编译器会为其自动生成默认的函数定义体,从而获得更高的代码执行效率,也可免除程序员手动定义该函数的工作量。

C++的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。如果程序员没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。当存在用户自定义的特殊成员函数时,编译器将不会隐式的自动生成默认特殊成员函数,而需要程序员手动编写,加大了程序员的工作量。并且手动编写的特殊成员函数的代码执行效率比编译器自动生成的特殊成员函数低。

C++11标准引入了一个新特性:defaulted函数。程序员只需在函数声明后加上”=default;”,就可将该函数声明为defaulted函数,编译器将为显式声明的defaulted函数自动生成函数体。

defaulted函数特性仅适用于类的特殊成员函数,且该特殊成员函数没有默认参数。

defaulted函数既可以在类体里(inline)定义,也可以在类体外(out-of-line)定义。

In C++11, defaulted and deleted functions give you explicit control over whether the special member functions are automatically generated.

“=default” instructs the compiler to generate the default implementation for the function. Defaulted functions have two advantages: They are more efficient than manual implementations, and they rid the programmer from the chore of defining those functions manually.

By default, C++ will provide a default constructor, copy constructor, copy assignment operator (operator=) and a destructor. If you provide alternate versions of any of these functions for your class, C++ will not provide a default version. However, in C++11, you can now specify that you would like the compiler to provide a default one anyway. This is done by prototyping the function and using the default specifier.

The default specifier can only be used with functions that have a default.

=default: it means that you want to use the compiler-generated version of that function, so you don't need to specify a body.

=delete: it means that you don't want the compiler to generate that function automatically.

下面是从其他文章中copy的测试代码,详细内容介绍可以参考对应的reference:

#include "default.hpp"
#include <iostream>// reference: http://www.learncpp.com/cpp-tutorial/b-6-new-virtual-function-controls-override-final-default-and-delete/
class Foo
{Foo(int x); // Custom constructorFoo() = default; // The compiler will now provide a default constructor for class Foo as well
};/
// reference: http://en.cppreference.com/w/cpp/language/default_constructor
struct A
{int x;A(int x = 1) : x(x) {} // user-defined default constructor
};struct B : A
{// B::B() is implicitly-defined, calls A::A()
};struct C
{A a;// C::C() is implicitly-defined, calls A::A()
};struct D : A
{D(int y) : A(y) {}// D::D() is not declared because another constructor exists
};struct E : A
{E(int y) : A(y) {}E() = default; // explicitly defaulted, calls A::A()
};struct F
{int& ref; // reference memberconst int c; // const member// F::F() is implicitly defined as deleted
};int test_default1()
{A a;B b;C c;// D d; // compile errorE e;// F f; // compile errorreturn 0;
}///
// reference: https://msdn.microsoft.com/zh-cn/library/dn457344.aspx
struct widget
{widget() = default;inline widget& operator=(const widget&);
};// Notice that you can default a special member function outside the body of a class as long as it’s inlinable.
inline widget& widget::operator=(const widget&) = default;

GitHub:https://github.com/fengbingchun/Messy_Test

C++11中default的使用相关推荐

  1. C++笔记-C++11中default及delete的使用

    今天在研究某开源事例代码时发现有人用default和delete关键字,在此学习了下,写了个小例子. default和delete只能作用于构造函数和析构函数. default关键字写了后会自动生成某 ...

  2. C++11中std::async的使用

    C++11中的std::async是个模板函数.std::async异步调用函数,在某个时候以Args作为参数(可变长参数)调用Fn,无需等待Fn执行完成就可返回,返回结果是个std::future对 ...

  3. 概率论中指数分布介绍及C++11中std::exponential_distribution的使用

    指数分布:在深度学习中,我们经常会需要一个在x=0点处取得边界点(sharp point)的分布.为了实现这一目的,我们可以使用指数分布(exponential distribution): p(x; ...

  4. 概率论中高斯分布(正态分布)介绍及C++11中std::normal_distribution的使用

    高斯分布:最常用的分布是正态分布(normal distribution),也称为高斯分布(Gaussian distribution): 正态分布N(x;μ,σ2)呈现经典的"钟形曲线&q ...

  5. C++11中头文件thread的使用

    C++11中加入了<thread>头文件,此头文件主要声明了std::thread线程类.C++11的标准类std::thread对线程进行了封装.std::thread代表了一个线程对象 ...

  6. C++11中std::forward_list单向链表的使用

    std::forward_list是在C++11中引入的单向链表或叫正向列表.forward_list具有插入.删除表项速度快.消耗内存空间少的特点,但只能向前遍历.与其它序列容器(array.vec ...

  7. C++/C++11中std::string用法汇总

    C++/C++11中std::string是个模板类,它是一个标准库.使用string类型必须首先包含<string>头文件.作为标准库的一部分,string定义在命名空间std中. st ...

  8. C++11中= delete;的使用

    C++11中,对于deleted函数,编译器会对其禁用,从而避免某些非法的函数调用或者类型转换,从而提高代码的安全性. 对于 C++ 的类,如果程序员没有为其定义特殊成员函数,那么在需要用到某个特殊成 ...

  9. C++11中unique_ptr的使用

    在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之 ...

最新文章

  1. Java项目:学生管理系统(无库版)(java+打印控制台)
  2. 高中生也能读懂的Docker入门教程
  3. 交叉熵比平方损失函数的优点
  4. 争自动驾驶领头羊还是确保技术安全?欧美选择不同
  5. cx oracle6 oracle10,python安装cx_Oracle
  6. CVPR 2021 双目图像压缩最新进展
  7. python request-Python之request模块-基础用法
  8. c语言ut8,C语言使用utlist实现的双向链表
  9. rds本地库到rds恢复_华为云RDS备份导入到本地
  10. 统计字符串中某个字符的个数
  11. 牛客网【每日一题】5月18日 「土」秘法地震
  12. 手动迁移KVM虚拟机
  13. EditorGridPanel 中使用checkbox列,并包含afterEdit事件
  14. HDOJ--2000--ASCII码排序(java实现)
  15. datax参数设置_DataX-操作HDFS
  16. (转载)C++面试宝典2011版
  17. android简单悬浮窗源码,android悬浮窗源码分析
  18. WS824的电话交换机设置分机号
  19. SQL2008升级SQL2008R2完全教程
  20. 网站添加错误页面提示功能(404、500错误提示)

热门文章

  1. Latex使用简单总结
  2. 基于Python的人脸自动戴口罩系统
  3. 开启灯光就是近光吗_保时捷Macan大灯改装技术,东莞专业豪车灯光改装修复。保时捷改LED大灯...
  4. 如何在CSDN MarkDown中居中显示并设置本地图像大小
  5. 360浏览器如何设置为像chrome谷歌浏览器那样输入网址回车在当前页面,而不是新建一个标签打开
  6. Revit结构2021专业人士的选择:从入门到专业
  7. Blender写实产品创作学习教程
  8. C++ STL: 分配器allocators 源码分析
  9. BeanShell使用json.jar包处理Json数据
  10. Linux篇---ftp服务器的搭建