C++11——“=default“和“=delete“函数特性
admin
2024-02-25 06:02:42
0

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]; // 错误

相关内容

热门资讯

腾讯回应元宝“崩了” 这个春节,各大AI厂商激战春节“营销档”。 2月2日凌晨,有网友从腾讯元宝领现金红包页面进入“每日做...
银行员工挥霍储户220万元无力... 据中国新闻周刊、南国早报等媒体报道,数年前,内蒙古一邮储银行员工将11名储户220万余元存款转走挥霍...
于文文回应演唱会晕倒:我没有评... 搜狐娱乐讯 2月2日,于文文在社交平台发文回应在演唱会晕倒,她表示感谢大家的关心,称工作人员和医护人...
16宗港股IPO审理暂停,香港... 香港证监会叫停16宗IPO审理,指示上市保荐人从速进行内部检讨,设定量化管理标准,单一保荐人负责项目...
资金风向标 | 中超控股获大额... Choice数据显示,2月2日,资金净流入额排名前十的个股依次是中超控股、胜宏科技、西部材料、双杰电...
原创 指... A股资金面正在积蓄新的动能,在“十五五”开局之年,资金“活水”与市场暖意共振,一幅崭新的投资图景正徐...
原创 帮... 今天盘面属实让人揪心,三大指数全跌超2%,4600多只个股绿油油一片,资源股跌停板上堆着几百亿封单,...
韩媒:中国U23国足让人们燃起... 北京时间2月2日消息,据韩国媒体My Daily报道:中国足球在U23亚洲杯上获得亚军,这让人们燃起...
一个月净流出超7900亿元!宽... 【导读】1月股票ETF资金累计净流出超7900亿元 1月最后一个交易日,A股市场陷入剧烈动荡,通信、...
政企面对面│市工商联召开“送服... 1月30日,市工商联组织铁岭天兴酒店、盛京银行银州支行举办“送服务、解难题、促发展”政银企融资对接会...
现货黄金继续下跌 有国内金饰克... 央广网北京2月2日消息(记者 宓迪)在上周遭遇史诗级暴跌后,国际金银价格继续迎来震荡调整。Wind数...
国际油价日内跌超5% 2月2日盘中,布伦特原油期货连续(当月)合约报价跌破66美元/桶,WTI原油连续(当月)合约报价跌破...
锐锢商城尚未盈利冲击港股IPO... 瑞财经 王敏 1月30日,据港交所披露,上海鑫谊麟禾科技股份有限公司(以下简称“鑫谊麟禾科技或锐锢商...
《CMI 2026年B2B内容... 当65%的营销团队将“内容质量”列为2026年提效的关键因素; 当AI工具的应用率高达95%,却仅...
雷军喊你过年!小米官宣2026... 小米官方今日发布“共赴新程”主题邀请函,正式官宣2026年米粉小年夜活动将于2月8日14:00在北京...
被海关点名,瑞士宾博奶粉出事了... 近日,海关总署进出口食品安全局接连发布紧急消费提示,点名瑞士宾博(Bimbosan)相关婴幼儿配方奶...
金价牛市偏技术性跳水、短期将迎... 黄金市场上周:国际黄金创历史记录性涨幅后,又创历史记录性大跌,最终收取巨长上影线倒垂形态,对于后市来...
多家上市公司出资参设具身智能机... 上周基金重点事件回顾丨01.26-02.01 睿兽分析每周整理最值得关注的基金重点事件,帮助大家及时...