C++中的默认成员函数
一般而言,对于一个用户自定义的类类型,以下四个函数在用户没有自定义的情形下,会由编译器自动生成:
1、default constructor
2、copy constructor
Someclass::Someclass(const Someclass &);
3、copy assignment operator
Someclass & Someclass::operator=(const Someclass &);
4、destructor
对于C++11,又增加了两个:
5、move constructor
Someclass::Someclass(Someclass &&);
6、move assignment
Someclass & Someclass::operator=(Someclass &&);
要牢记这几个函数的原型(输入参数、返回类型),还有几条规则,关于何时编译器不会生成上述默认成员函数的:
若用户自定义了任意形式的构造函数(即使是拷贝构造函数),编译器将不会生成默认构造函数
若定义了析构函数,或拷贝构造函数或拷贝赋值操作符,编译器将不会生成默认的move constructor和move assignment
若定义了move construcor或move assignment,编译器将不会生成默认的拷贝构造函数或拷贝赋值操作符。
最后,在C++11中有一种很别致的偷懒的办法,
Someclass::Someclass(const Someclass &) = default,表示用户需要编译器默认生成该成员函数,当然这个只对上述六个函数有效。
C++中的默认成员函数的更多相关文章
- C++默认成员函数
1.什么是面向对象? 概念:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法. 对象指的是类的实例,将对象作为程序的基本单元,将程 ...
- 如何禁止C++默认成员函数
如何禁止C++默认成员函数 发表于 2016-03-02 | 分类于 C++ | 阅读次数 17 前言 前几天在一次笔试过程中被问到C++如何设计禁止调用默认构造函数,当时简单的想法是直 ...
- 在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static
在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create ...
- vc MFC 通过IDispatch调用默认成员函数
CComPtr<IDispatch> spDisp(IDispatch *); if(!spDisp) return; DISPPARAMS dispParam={0}; //没有参数 V ...
- C++中的类继承(2)派生类的默认成员函数
在继承关系里面, 在派生类中如果没有显示定义这六个成员 函数, 编译系统则会默认合成这六个默认的成员函数. 构造函数. 调用关系先看一段代码: class Base { public : Base() ...
- map中的erase成员函数用法
转载于 http://www.cnblogs.com/graphics/archive/2010/07/05/1771110.html http://hi.baidu.com/sdkinger/it ...
- (C/C++学习)3.C++中cin的成员函数(cin.get();cin.getine()……)
说明:流输入运算符,在一定程度上为C++程序的开发提供了很多便利,我们可以避免C语言那种繁琐的输入格式,比如在输入一个数值时,还需指定其格式,而cin以及cout则不需要.但是cin也有一些缺陷,比如 ...
- C/C++中的常成员函数
代码: #include <iostream> using namespace std; class A{ public: void func1(){ cout<<" ...
- C++笔记007:易犯错误模型——类中为什么需要成员函数
先看源码,在VS2010环境下无法编译通过,在VS2013环境下可以编译通过,并且可以运行,只是运行结果并不是我们期待的结果. 最初通过MyCircle类定义对象c1时,为对象分配内存空间,r没有初始 ...
随机推荐
- glob/globfree--找出匹配模式的路径名
语法 #include <glob.h> int glob(const char *pattern, int flags, int (*errfunc) (const char *epat ...
- java删除递归文件夹及文件夹下文件
public static void delUrlLocalFile(String urlPath) { File file = new File(urlPath); if(file.isDirect ...
- Web安全测试(一)-手工安全测试方法&修改建议
常见问题 1.XSS(CrossSite Script)跨站脚本攻击 XSS(CrossSite Script)跨站脚本攻击.它指的是恶意攻击者往Web 页面里插入恶意 html代码,当用户浏览该页之 ...
- python笔记4 - 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这 ...
- 第一百四十九节,封装库--JavaScript,表单验证--验证用户名
封装库--JavaScript,表单验证--验证用户名 注册验证功能,顾名思义就是验证表单中每个字段的合法性,如果全部合法才可以提交表单. 效果图 聚集光标时 信息不合法是 信息合法时 html &l ...
- 无状态会话Bean、有状态会话Bean、CMP与BMP中,哪一种Bean不需要自己书写连接数据库的代码?
无状态会话Bean.有状态会话Bean.CMP与BMP中,哪一种Bean不需要自己书写连接数据库的代码? A.无状态会话Bean B.有状态会话Bean C.CMP D.BMP 解答:C
- oracle 里 插入空字符串会被转成null插入
oracle 里 插入空字符串会被转成null插入 因为非空列如果要插入空字符串数据,最好是插个空格,因为空字符串会报错
- server r2 系统更新文件清理
https://support.microsoft.com/zh-cn/kb/2852386
- Duilib教程-控件练习
一.控件消息的响应. 在HelloDuilib例子中,程序不能退出,在这里,我将添加一个关闭按钮,当点击它时,调用PostQuitMessage进行退出. 首先在界面的右上角添加一个关闭按钮,并取名为 ...
- std::function(3)
#include <functional> #include <string> #include <iostream> using namespace std; v ...