已阅读:2,373 次
关于new定位符的用法
ian | C/C++ | 2011/04/02


请先看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Base
{
public:
   Base():m_Id(0) {}
   Base(int level)
   {
       Base();
       m_Level = level;
   }
private:
   int m_Id;
   int m_Level;
}


这段代码中,Base有两个构造函数,一个默认构造函数和一个带参数的构造函数,后一个函数里调用了默认构造函数。

类似这种场景,其实我们经常遇到的,比如一个类有多个带参数的构造函数,并且所有这个构造函数都需要执行默认构造函数的逻辑,包括将某些属性初始化等,这个时候像上面的代码那样来直接调用Base()这个默认构造函数似乎是个很简洁明了的方法,但是实际debug结果却发现,程序的执行结果与预期不一致。

Debug发现,在执行”Base();”这里时,程序只是构造了一个Base的临时对象,执行结束后,这个临时对象就被释放了,所以当前实例化的对象并没有执行其的默认构造函数的代码,因此m_Id不一定被准确赋值为0。

那么,有没有什么方法能够直接调用”当前类”的构造函数呢?这样就毋须将类似这种逻辑封装到一个单独的方法里面,从而程序逻辑看上去会更简洁。

我们可以把”Base();”替换成”new (this)Base();”,即如下所示:

1
2
3
4
5
Base(int level)
{
    new (this)Base();
    m_Level = level;
}

这句话的意思是在this指向的内存地址处构造一个Base对象,这里new并不是新分配一个Base对象的示例,而是作为定位操作符来使用的。这种方式与构造一个临时对象然后拷贝到当前地址处相比,最大的优点是,它并不会构造一个临时对象,而是直接在当前地址构造示例,所以效率是很高的。

原创文章,转载请注明:转载自ian的个人博客[http://www.icodelogic.com]
本文链接地址: http://www.icodelogic.com/?p=105

tags:

没有评论

发表评论

你需要先 登录 才能回复