Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否可以将复制构造函数设为私有,并且仍然使用默认实现_C++_Copy Constructor - Fatal编程技术网

C++ 我是否可以将复制构造函数设为私有,并且仍然使用默认实现

C++ 我是否可以将复制构造函数设为私有,并且仍然使用默认实现,c++,copy-constructor,C++,Copy Constructor,我认为这是不可能的,但我不妨问问。 我可以声明一个私有副本构造函数并且仍然使用默认实现吗 背景:我有一个向量很大的类,除了一个成员函数外,我不想调用复制构造函数。使用标准的公共副本可能会 很容易导致错误,例如在迭代中忘记引用(foreach(Type el,vectobigobjects),而不是foreach(Type const&el,vectobigobjects))。因此,我想保留标准副本构造函数,但只是将其私有化 在不重写复制系数定义的情况下,这是否可行 在不重写复制系数定义的情况下,

我认为这是不可能的,但我不妨问问。 我可以声明一个私有副本构造函数并且仍然使用默认实现吗

背景:我有一个向量很大的类,除了一个成员函数外,我不想调用复制构造函数。使用标准的公共副本可能会 很容易导致错误,例如在迭代中忘记引用(
foreach(Type el,vectobigobjects
),而不是
foreach(Type const&el,vectobigobjects)
)。因此,我想保留标准副本构造函数,但只是将其私有化

在不重写复制系数定义的情况下,这是否可行

在不重写复制系数定义的情况下,这是否可行

在C++11中,是的。您只需声明构造函数并将其标记为默认值:

这将定义一个副本构造函数,该构造函数的定义与隐式生成的构造函数的定义相同,但将是
私有的
。例如:

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!
}
这是一本书

请注意,类定义中的用户声明构造函数(包括复制构造函数)禁止隐式生成默认构造函数,即使其定义是默认的。例如,这就是为什么我必须在上面的示例中显式声明
X
的默认构造函数

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!
}