美文网首页
c++11 类默认函数的控制:"=default" 和 "=de

c++11 类默认函数的控制:"=default" 和 "=de

作者: Freboat | 来源:发表于2018-06-17 16:31 被阅读0次

//zz: https://www.cnblogs.com/lsgxeva/p/7787438.html

#define _CRT_SECURE_NO_WARNINGS#include#include#include#include//c++11 类默认函数的控制:"=default" 和 "=delete"函数

/*

C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。

这些类的特殊成员函数负责创建、初始化、销毁,或者拷贝类的对象。

如果程序员没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,则编译器会隐式的为这个类生成一个默认的特殊成员函数。

*/

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

class X

{

public:

    X() = default; //该函数比用户自己定义的默认构造函数获得更高的代码效率

    X(int i)

    {

        a = i;

    }

private:

    int a;

};

X obj;

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

class X1

{

public:

    int f() = default;      // err , 函数 f() 非类 X 的特殊成员函数

    X1(int, int) = default;  // err , 构造函数 X1(int, int) 非 X 的特殊成员函数

    X1(int = 1) = default;  // err , 默认构造函数 X1(int=1) 含有默认参数

};

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

class X2

{

public:

    X2() = default; //Inline defaulted 默认构造函数

    X2(const X&);

    X2& operator = (const X&);

    ~X2() = default;  //Inline defaulted 析构函数

};

X2::X2(const X&) = default;  //Out-of-line defaulted 拷贝构造函数

X2& X2::operator= (const X2&) = default;  //Out-of-line defaulted  拷贝赋值操作符

// 为了能够让程序员显式的禁用某个函数,C++11 标准引入了一个新特性:"=delete"函数。程序员只需在函数声明后上“=delete;”,就可将该函数禁用。

class X3

{

public:

    X3();

    X3(const X3&) = delete;  // 声明拷贝构造函数为 deleted 函数

    X3& operator = (const X3 &) = delete; // 声明拷贝赋值操作符为 deleted 函数

};

// "=delete"函数特性还可用于禁用类的某些转换构造函数,从而避免不期望的类型转换

class X4

{

public:

    X4(double)

    {

    }

    X4(int) = delete;

};

// "=delete"函数特性还可以用来禁用某些用户自定义的类的 new 操作符,从而避免在自由存储区创建类的对象

class X5

{

public:

    void *operator new(size_t) = delete;

    void *operator new[](size_t) = delete;

};

void mytest()

{

    X4 obj1;

    X4 obj2=obj1;  // 错误,拷贝构造函数被禁用

    X4 obj3;

    obj3=obj1;    // 错误,拷贝赋值操作符被禁用

    X5 *pa = new X5;      // 错误,new 操作符被禁用

    X5 *pb = new X5[10];  // 错误,new[] 操作符被禁用

    return;

}

int main()

{

    mytest();

    system("pause");

    return 0;

}

相关文章

  • c++11 类默认函数的控制:"=default" 和 "=de

    //zz:https://www.cnblogs.com/lsgxeva/p/7787438.html #defi...

  • C++11中对类(class)新增的特性

    突然发现以前的一篇老文 default/delete 控制默认函数 在我们没有显式定义类的复制构造函数和赋值操作符...

  • C++11 =default 和 =delete

    C++11 =default 和 =delete 1. = default 1.1 引入背景 C++ 的类有四类特...

  • 深入理解C++11 2.11 模板函数的默认模板参数

    C++98中,类模板支持默认模板参数,但是函数模板并不支持,C++11则支持了函数模板的默认参数。如: 并且,类模...

  • Java 关键字

    类别关键字说明访问控制private私有的protected受保护的public公共的default默认类、方法和...

  • =default

    使用 =default 来获得默认的构造函数、拷贝控制函数、析构函数 特别的: 这样我们就可以不用显式的构造,而直...

  • 2018-10-06

    C++11新关键字default C++11添加了很多新特性,使C++看上去更加的灵活和面向对象,其中新关键字de...

  • Python基础错误1

    函数默认参数 Error : non-default argument follows default argum...

  • C# default(T)关键字

    C#关键词default函数,default(T)可以得到该类型的默认值. C#在类初始化时,会给未显示赋值的字段...

  • Go语言学习笔记 - 函数

    函数 不支持 嵌套 (nested)、重载 (overload) 和 默认参数 (default paramete...

网友评论

      本文标题:c++11 类默认函数的控制:"=default" 和 "=de

      本文链接:https://www.haomeiwen.com/subject/xsmweftx.html