C++11——“=default“和“=delete“函数特性-创新互联

c++的类有四种特殊成员函数:

创新互联建站专业为企业提供扎赉诺尔网站建设、扎赉诺尔做网站、扎赉诺尔网站设计、扎赉诺尔网站制作等企业网站建设、网页设计与制作、扎赉诺尔企业网站模板建站服务,十载扎赉诺尔做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
  • 默认构造函数
  • 析构函数
  • 拷贝构造函数
  • 拷贝赋值运算符

​ 这些类的特殊成员函数负责创建、初始化、销毁或者拷贝类的对象。
​ 如果程序员没有显示的为类定义某个特殊成员函数,而又需要用到该特殊成员函数时,编译器会隐式地为这个类生成一个默认的特殊成员函数;
​ 而如果程序员显示的定义了某个特殊成员函数,编译器将不会自动为你生成默认的构造函数了,如果还想用默认构造函数,就需要自己手写,如果变量很多的话这将会很麻烦。

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

​ defaulted函数特性仅适用于类的特殊成员函数,且该特殊成员函数没有默认参数。
​ defaulted函数既可以在类体里(inline)定义,也可以在类体外(out-of-line)定义。

default的用处

来看一个简单的例子:

例子来源

class Student
{int ID;
std::string sName;
};

Student s1;
Student s2(s1);

在不定义任何构造函数的情况下,Student对象能定义成功,因为编译器会默认为我们设置几个构造函数,多的不说了,就说最简单的两个

Student() {}
Student(const Student& o):ID(o.ID),sName(o.sName)
{}

一个是在不提供任何参数的情况下的默认构造函数,另一个是通过另一个对象构造的拷贝构造函数。

class Student
{int ID;
std::string sName;
public:
Student(const string& _sName):sName(_sName){}
};

Student s1;
Student s2(s1);

但是如果我们自己加了一个只指定名字参数的构造函数,上面这段代码就编译不过了。因为编译器就不自动为你生成默认的那些构造函数了,因为它觉得你想根据自己的需求定义构造函数。但是,如果你除了自己自定义的构造函数,还想用编译器为你生成默认的,怎么办?

class Student
{int ID;
std::string sName;
public:
Student() {}
Student(const Student& o) :ID(o.ID), sName(o.sName)
{}
Student(const string& _sName):sName(_sName){}
};

传统的办法就是受点累,把编译器为你生成的那两个你亲自写一遍,这样不累吗?尤其是student成员变量很多的时候。有了default关键以后,省事多了,

class Student
{int ID;
    std::string sName;
    public:
    Student() = default;
    Student(const Student& o) = default;
    Student(const string& _sName):sName(_sName){}
};

Student s1;
Student s2(s1);

那两个默认的构造函数,我们想要的实现跟编译器默认的一模一样,直接指定个default就行了,不用全部手打出来。这就是default这个关键字的作用。

完整的例子如下所示:

class x2
{public:
    	x2() = default;	//inline(类内) defaulted 默认构造函数
    	x2(const x2&);
    	x2& operator=(const x2&);
    	~x2() = default;	//inline(类内) defaulted 析构函数
};

x2::x2(const x2&) = default; // 类外 拷贝构造函数
x2& x2::operator=(const x2&) =default;	//类外 拷贝赋值操作符
delete的用处

同样的对于上面的例子中,如果你不想让诸如:

Student s1;
Student s2(s1);

这样的默认构造函数被调用,除了写显示的特殊函数,让编译器为你排除掉,还可以通过=delete函数特性来为你禁用某些函数

例如:

class x5
{public:
    	// 禁用类的new操作符
    	void *operator new(size_t) = delete;
    	void *operator new[](size_t) = delete;
}

x5 *pa = new x5; // 错误
x5 *pb = new x5[10]; // 错误

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享名称:C++11——“=default“和“=delete“函数特性-创新互联
网页URL:http://pwwzsj.com/article/dedoee.html