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

相关内容

热门资讯

明天生效!美国CPSC新规全面... 7月8日起(明天),美国消费品安全委员会(CPSC)将联合美国海关与边境保护局(CBP),正式全面实...
北京挂牌顺义、房山2宗地 起始... 观点网讯:7月7日,北京市规划和自然资源委员会公告挂牌2宗地块,分别为房山区良乡大学城主园区FS00...
平桂区财政局:打好“三贷一库”... 近年来,平桂区财政局紧扣黄金珠宝全产业链发展脉搏,针对企业融资“痛点”精准施策,联合金融机构创新推出...
红熊AI营销获客系统V1.3.... 在流量红利见顶、获客成本持续攀升的当下,企业增长的命题始终聚焦:如何用较低的成本,获取更高质量的目标...
原创 为... 众所周知,上海的高房价是全国出了名的。即使是市中心区域的老破小,房价也要达到3-400万,如果是好一...
企业用了两年AI,为什么财报没... 作者:王聪彬 去年零一万物创始人、CEO 李开复就在强调,AI落地打法,要从“一把手工程”开始。 一...
韩国股市暴跌触发熔断机制 △韩国证券交易所(资料图) 韩国综合股价指数(KOSPI)7日盘中一度大跌超8%,触发市场熔断机制。...
爱柯迪跌3.11%,成交额1.... 来源:新浪证券-红岸工作室 7月7日,爱柯迪跌3.11%,成交额1.57亿元,换手率1.08%,总市...
高善文去世,享年55岁 记者据多方证实,国投证券前首席经济学家高善文因病去世,享年55岁。 高善文被公认为是中国资本市场上颇...
南昌黄金回收怎么选更安心 附近... 近年来随着黄金价格波动,不少南昌市民有处置闲置黄金的需求,但黄金回收市场鱼龙混杂,不少用户曾遭遇套路...
SpaceX股票几乎回到首日开... 来源:环球市场播报 SpaceX股价今日下跌逾5%,至152美元以下,距离该火箭制造商在6月12日...
景泽生物三闯港股IPO:尚未实... 财通社——7月3日,景泽生物医药(合肥)股份有限公司(简称“景泽生物”)再次向香港交易所递交主板上市...
亚马逊拟发行债券募资至少250... 来源:环球市场播报 核心要点 消息人士向记者戴维・费伯透露,亚马逊计划通过债券发行募资至少 25...
一季净利暴涨3020%!又一存... 作者 | 铅笔道 松格 编辑 | 铅笔道 黄小贵 2025年前四个月,宏芯宇的净利润只有1.23亿元...
原创 暴... 2026年夏天,饮料这行的人普遍难受。以往一到六七月,仓库就得连轴转,货车排队装水,老板数钱数到手抽...
活力中国调研行|探访李政道研究... 东方网记者程琦7月7日报道:初夏的张江科学城,草木葱茏,创新活力跃动。2026年“活力中国调研行”上...
超5家上市银行密集“自购”,释... 下半年伊始,A股上市银行再度传来股东、高管增持的消息。 常熟银行日前接连发布两份公告称,为提升持股比...
经济学家高善文去世,享年55岁 7月7日晚,据新经济学家智库消息,著名经济学家高善文去世,享年55岁。 公开资料显示,高善文出生于1...
连板背后的资本棋局:华芯晶电实... 图片来源:视觉中国 蓝鲸新闻7月7日讯(记者 徐晓春)因筹划控制权变更停牌五个交易日后,阿科力(60...
AI高端对话:智能体“凉了”?... 智东西 作者 | 杨京丽 编辑 | 心缘 智东西7月7日报道,7月2日,2026中国智能体大会在杭州...