加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为构造函数委派分配给* this

发布时间:2020-12-16 06:58:49 所属栏目:百科 来源:网络整理
导读:我正在查看C 11中的一些新功能,由于我当前的GCC版本,我无法使用构造函数委派.但它让我想到复制这样的功能: class A{public: A() : num( 42 ) {} A( int input ) { *this = A(); num *= input; } int num;}; 它肯定编译和工作正常,代码如下: A a;cout "a: "
我正在查看C 11中的一些新功能,由于我当前的GCC版本,我无法使用构造函数委派.但它让我想到复制这样的功能:

class A
{
public:
    A() : num( 42 ) {}
    A( int input ) { *this = A(); num *= input; }

    int num;
};

它肯定编译和工作正常,代码如下:

A a;
cout << "a: " << a.num << endl;
A b( 2 );
cout << "a: " << b.num << endl;

返回这个,这是正确的.

42
84

显然这是一个非常简单的例子,但除了内存效率低下(两个A创建并且在被销毁之前被另一个覆盖),可能会出现什么问题?它当然看起来像代码味道,但我想不出一个非常好的理由.

解决方法

您没有使用整数初始化对象,而是修改默认的初始化对象.这可能是也可能不是问题.通常人们会在某些init()函数中将常见的东西视为具有与委托ctors类似的功能.但是,在某些情况下,这是不希望/错误/不可能的:

>当你有一个引用成员时,你必须在ctor中初始化它,你不能默认初始化它然后覆盖.使用指针代替可以提供帮助.
>对于某些成员,默认初始化会执行某些操作,并且覆盖会执行其他操作.性能方面,立即初始化成员会更有效率.根据初始化的作用,这可能只是性能损失,但对于对象的某些副作用,它甚至可能是平面错误.
>该成员可能无法转让.

此外,这被一些人认为是不好的风格.我个人认为它很糟糕,因为我觉得你应该总是初始化而不是稍后分配,即使对于简单的情况,因为有一天你忘记了一个重要的案例,然后失去的表现咬你.

但是YMMV.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读