189 8069 5689

你知道一个空的类里面有什么吗?-创新互联

你知道一个空的类里面有什么吗?

站在用户的角度思考问题,与客户深入沟通,找到交城网站设计与交城网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站设计、网站建设、企业官网、英文网站、手机端网站、网站推广、域名注册网站空间、企业邮箱。业务覆盖交城地区。

虽然这篇文章的标题,看起来是有点找抽——既然一个类是空的,那不就是说里面啥也没有嘛? 比如这样:

class empty

{ };


上面定义了一个真的很空的空类,一对大括号里面除了空气之外,真的什么都没有!根据C++的语法,这样的类是可以通过编译的,并且可以跟别的小朋友一样到处玩耍、奔跑和嬉闹。look:

empty e1;    // e1:“我很空虚!”

empty e2(e1); // e2:“我跟你一样空虚!”

empty e3 = e1; // e3:“我也是!我也是!”


既然它能干这么多事情,说明这个“空”,是内含玄机的。


仔细观察上面三条语句,会发现如下事实:创建e1说明类empty中必然有无参构造函数,创建e2说明类中必然有复制构造函数,创建e3说明类中必然有赋值操作符函数,当然我们还知道任何对象在释放内存时都会调用析构函数,因此毫无悬念类empty也必然有析构函数。

综上所述,你自认为内部只有空气的类empty,实际上是这个样子的:

class empty

{

public:

  empty();  // 无参构造函数

  empty(const empty &rh); // 复制构造函数

  ~empty(); // 析构函数

  empty & operator=(const empty &rg); // 赋值操作符函数

};

注:如果类empty继承了虚基类,那么析构函数也将会自动被定义为虚函数。

原来!C++编译器会为我们做这么多事情!

但,凡事皆有例外,以上那些不请自来的函数们,是不是任何时候都会出现呢?可不一定。请看精心设计的类node:

class node

{

public:

  node(string &n, const int &a); // 显式构造函数

private:

   string &name;

   const int age;

};

node::node(string &n, const int &a)

     : name(n), age(a)

{ }


首先,由于你提供了显式的构造函数,因此系统将拒绝生成默认的无参构造函数

其次,注意到类node中包含引用成员name,以及非静态的const型成员age,他们之中的任一个,都会导致系统拒绝生成默认的赋值操作符函数

想象一下,此时如果定义两个node的对象x1和x2,再让它们之间相互赋值会怎样?

string s1("aa"), s2("bb");

node x1(s1, 100), x2(s2, 200);

x1 = x2;


由于x1.name是引用,该引用指向了字符串s1(说白了就是x1.name就是s1的别名),那么 x1 = x2 会让 x1.name 指向 s2 吗? 从C++基本语法得知这不可能!因为引用一旦指定了关联的目标就再也不能修改。那么, x1 = x2 会让 x1.name指向的s1的值变为"bb"吗? 这么一来,那其他跟x1无关的但使用了字符串s1的对象岂不是要平白无故地遭受牵连?

以上分析,针对类的非静态const型成员age而言,是一模一样的,因为age也不应该通过类对象的赋值操作而发生改变。

因此,在上述情形下,默认的赋值操作符函数将不复存在,如果你非要为node提供赋值操作,你必须自己显式地定义 operator=(),否则编译器将会在上述代码的 x1 = x2 这一行报错。

事实上,还有一种情形会导致系统拒绝生成默认赋值操作符函数,那就是当类node的基类定义了private的赋值操作符函数。这是因为,当要赋值node对象时,必须先调用基类的赋值操作符,而private的权限设定使这一想法立即破灭。

总而言之,以下情形发生时系统将拒绝生成默认赋值操作函数

  1. 类中含有引用成员

  2. 类中含有非静态const型成员

  3. 类继承自含有private赋值操作符函数的基类



诡异的是,即便在上述条件下,系统依然会赞同生成默认的拷贝构造函数,即以下代码仍然是合法的:

string s1("aa");

node x1(s1, 100);

node x2(x1);


此时,x2和x1内的两个引用name都指向了s1,他们中的任意一个发生了变化都将对s1产生影响。消除这样的副作用的办法是,自己定义一个复制构造函数来达成恰当的逻辑。

识别下面二维码,进入 微店●秘籍酷逛逛吧!


你知道一个空的类里面有什么吗?


你知道一个空的类里面有什么吗?

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前名称:你知道一个空的类里面有什么吗?-创新互联
路径分享:http://cdxtjz.cn/article/ghops.html

其他资讯