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,表示用户需要编译器默认生成该成员函数,当然这个只对上述六个函数有效。

时间: 2024-11-09 15:44:54

C++中的默认成员函数的相关文章

(继承及其访问限定符)&&(派生类及其默认成员函数)&&(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

C++中string的成员函数

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

(继承及其访问限定符)&amp;&amp;(派生类及其默认成员函数)&amp;&amp;(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

如何禁止C++默认成员函数

如何禁止C++默认成员函数 发表于 2016-03-02   |   分类于 C++  |   阅读次数 17 前言 前几天在一次笔试过程中被问到C++如何设计禁止调用默认构造函数,当时简单的想法是直接将默认构造函数声明为private即可,这样的话对象的确不能直接调用.之后查阅了<Effective C++>之后得到了比较详尽的解释. 了解C++的默认行为 当我们创建空类时,C++默认给我们生成了四种成员函数: 构造函数 析构函数 拷贝构造函数(copy) 重载=的拷贝函数(copy ass

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static

在C++的类中,普通成员函数不能作为pthread_create的线程函数,如果要作为pthread_create中的线程函数,必须是static ! 在C语言中,我们使用pthread_create创建线程,线程函数是一个全局函数,所以在C++中,创建线程时,也应该使用一个全局函数.static定义的类的成员函数就是一个全局函数. 更多 参考  http://blog.csdn.net/ksn13/article/details/40538083 #include <pthread.h> #

C++6个默认成员函数

问题:C++中的空类,默认情况下会产生哪些类成员函数? 系统默认的缺省构造函数和拷贝构造函数(复制构造函数) 系统默认提供的析构函数. 系统默认的运算符重载函数(拷贝赋值函数):用于同类对象之间的赋值. 系统默认的取值运算:当对类的对象进行取地址(&)时会被调用. 1.构造函数法和析构函数存在的必要性和作用: (1).构造函数的必要性和作用(用构造函数确保初始化): 解决同种类型的不同对象的初始化问题. 保证每个对象的数据成员都有合适的初始值. (2).析构函数的必要性和作用(用析构函数确保清除

将类的定义放在头文件中,把成员函数的实现代码放在一个cpp文件中

写这种.h和.cpp文件分开的大程序,虽然对很多人来说很简单,对自己来说算是第一次吧,好好学C++,加油~ 题目:定义Point类,由Point派生出Circle类,再由Circle派生出Cylinder类.将类的定义部分分别作为3个头文件,对他们的成员函数的定义分别作为3个源文件 1.Point.h文件 1 #ifndef POINT_H 2 #define POINT_H 3 #include<iostream> //头文件也需要包含这个 4 using namespace std; 5

类的六个默认成员函数-&gt;构造函数

在C++中当你创建一个空类时,编译器会默认声明一个default构造函数,copy构造函数,一个copy assignment操作符,一个析构函数.注意,编译器只声明,只有当这些函数被调用时,他们才会被创建. 举个栗子,当你写下 class Empty() {}; 实际上在编译器中为你实现了这样的代码 class Empty { Empty(){} Empty(const Empty& rhs){} ~Empty(){} Empty& operator=(const Empty&

C++类的默认成员函数

成员函数隐含this指针参数: 每成员函数一个隐式的指针形参(构造函数除外): 对象在调用成员函数时,编译器会将对象的地址传递给this指针: 1.构造函数(需用一个公有成员函数对私有的成员变量进行初始化,在对象构造时执行一次,无参的构造函数和带缺省值的构造函数都是缺省构造函数 ,缺省的构造函数只能有一个) Mystring(const char *str="")//带缺省值的构造函数 { _str = new char[strlen(str) + 1]; strcpy(_str, s