2013-04-07 53 views
5

我认为这是不可能的,但我不妨问。 我可以声明一个私有的Copy-Constructor并仍然使用默认实现吗?我可以使复制构造函数私有,仍然使用默认实现

背景:我有一个非常大的矢量类,我不想调用复制构造函数,除了一个成员函数。使用标准的公共拷贝可能会容易地导致诸如例如在迭代中忘记参考(foreach(Type el,vectOfBigObjects)而不是foreach(Type const& el,vectOfBigObjects))。因此,我想保留标准版本的发布者,但只是将其设为私有。

这可能没有重写copy-ctors定义?

回答

11

这可能没有重写copy-ctors定义?

在C++ 11中,是的。你只需要声明构造并将其标记为拖欠

struct X 
{ 
    // ... 
private: 
    X(X const&) = default; 
}; 

这将定义哪些将有相同的定义是一个隐含生成一个拷贝构造函数,但会private。例如:

struct X 
{ 
    X() { } // Required because a user-declared constructor in 
      // the definition of X inhibits the implicit generation 
      // of a default constructor (even if the definition is 
      // defaulted!) 

    void foo() 
    { 
     // ... 
     X tmp = *this; // OK! 
     // ... 
    } 

private: 

    X(X const&) = default; // Default definition, accessible to 
          // member functions of X only! 
}; 

int main() 
{ 
    X x; 
    // X x2 = x; // ERROR if uncommented! 
} 

这是live example

注意的是,在一个类的定义一个用户声明的构造(包括拷贝构造)抑制所述隐式生成一个缺省的构造的,即使其定义默认值。这就是为什么,例如,我不得不在上面的例子中明确声明X的默认构造函数。

相关问题