重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
c++的类有四种特殊成员函数:
创新互联建站专业为企业提供扎赉诺尔网站建设、扎赉诺尔做网站、扎赉诺尔网站设计、扎赉诺尔网站制作等企业网站建设、网页设计与制作、扎赉诺尔企业网站模板建站服务,十载扎赉诺尔做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。 这些类的特殊成员函数负责创建、初始化、销毁或者拷贝类的对象。
如果程序员没有显示的为类定义某个特殊成员函数,而又需要用到该特殊成员函数时,编译器会隐式地为这个类生成一个默认的特殊成员函数;
而如果程序员显示的定义了某个特殊成员函数,编译器将不会自动为你生成默认的构造函数了,如果还想用默认构造函数,就需要自己手写,如果变量很多的话这将会很麻烦。
c++11标准因此引入了新特性:default函数。程序员只需在函数声明后加上”=default;”,就可将该函数声明为defaulted函数,编译器将为显式声明的defaulted函数自动生成函数体。
defaulted函数特性仅适用于类的特殊成员函数,且该特殊成员函数没有默认参数。
defaulted函数既可以在类体里(inline)定义,也可以在类体外(out-of-line)定义。
来看一个简单的例子:
例子来源
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元起,快前往官网查看详情吧