Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++_Exception - Fatal编程技术网

C++ 复制构造函数和运算符中的不可复制对象和异常=

C++ 复制构造函数和运算符中的不可复制对象和异常=,c++,exception,C++,Exception,我想使类的对象不可复制,所以我把copy构造函数和operator=放在private部分。然而,有一个类是这个类的朋友,所以它可以访问私有方法。在copy构造函数和operator=中放置throw exception是否是一个好主意,以确保对象不会被复制?使其不可复制的一种方法是只声明复制构造函数,但根本不实现它。如果有人试图使用链接器,这将在编译时强制执行链接器错误 class foo { private: foo(const foo&); // not defined

我想使类的对象不可复制,所以我把copy构造函数和operator=放在private部分。然而,有一个类是这个类的朋友,所以它可以访问私有方法。在copy构造函数和operator=中放置throw exception是否是一个好主意,以确保对象不会被复制?

使其不可复制的一种方法是只声明复制构造函数,但根本不实现它。如果有人试图使用链接器,这将在编译时强制执行链接器错误

class foo
{
private:
    foo(const foo&); // not defined
    foo& operator=(const foo&); // not defined
};

@Mystical已经回答了这个问题,这通常是在C++03中完成的。但在C++11中,您可以更好地执行此操作:

class foo
{
private:
    foo(const foo&) = delete; 
    foo& operator=(const foo&) = delete; 
};
=delete
表示
foo
不支持复制语义,因为它已通过显式标记
delete
被禁用。我在这里详细解释了这一点:


@BrendanLong:我用链接编辑了这篇文章。请仔细阅读。请注意,你应该始终接受给定的建议,而不仅仅是在你有朋友的情况下,因为课堂本身也不应该复制此类建议。