是否可以使用带有参数的构造函数作为类名c ++?

时间:2012-02-15 10:49:31

标签: c++ pointers

这是内存映射文件共享的示例代码。 mapped_region是负责它的d类 现在我在深入挖掘之前我无法理解为什么要使用此类声明。任何人都可以向我解释一下吗?

class mapped_region
{
   // Non-copyable
   mapped_region(const mapped_region &);

   // Non-assignable
   mapped_region &operator=(const mapped_region &);

   public:

   typedef /*implementation-defined*/ offset_t;
   typedef /*implementation-defined*/ accessmode_t;
   static const accessmode_t          invalid_mode;
   static const accessmode_t          read_only;
   static const accessmode_t          read_write;
   static const accessmode_t          copy_on_write;

   mapped_region();

   mapped_region( const memory_mappable & mappable
                , accessmode_t            mode
                , offset_t                mappable_offset
                , std::size_t             size = 0
                , const void *            address = 0);

   mapped_region(mapped_region &&other);

   std::size_t get_size() const;

   void*       get_address() const;

   offset_t    get_offset() const;

   accessmode_t get_mode() const;

   void flush(std::size_t region_offset = 0, std::size_t numbytes = 0);

   void swap(mapped_region &other);

   ~mapped_region();
};

在这个例子中

// Non-copyable
mapped_region(const mapped_region &); 
这是什么意思?

5 个答案:

答案 0 :(得分:3)

是的,可以使用参数名称与类相同的构造函数 有两种情况可能:

在您的代码中:

mapped_region(const mapped_region &);

表示复制构造函数,而:

mapped_region(mapped_region &&other);

表示移动构造函数

复制构造函数用于创建类对象的副本。每当您通过值传递类对象作为函数参数或需要类对象的副本时,编译器就会调用复制构造函数来创建此对象。

如果您想限制班级用户复制您的班级对象,则声明复制功能复制构造函数& 复制赋值运算符= private,这就是您的代码在这种情况下所做的事情,它会限制您的代码用户创建您的类mapped_region的任何副本。请注意,类的默认访问说明符为private

由于您的代码声明了一个Move构造函数,我假设您使用的是C ++ 11,因此在此处实现所需功能的更好方法是使用C +中提供的 explicitly deleting special member functions +11。

例如:

class mapped_region{
    mapped_region & operator=(const mapped_region&) = delete;
    mapped_region(const mapped_region&) = delete;
    mapped_region() = default;
};

答案 1 :(得分:2)

这是copy-constructor。它用于创建类实例的副本。

mapped_region foo;
mapped_region bar(foo); // creates bar as copy of foo

如果将copy-constructor声明为private,则第二行会导致编译器错误,因为它会尝试访问copy-cosntructor。这样做是为了防止复制该类的对象。这通常在类包装无法复制的资源(如文件或线程)时完成。

答案 2 :(得分:2)

class成员默认为private

class mapped_region
{
   // Non-copyable
   mapped_region(const mapped_region &);

   // Non-assignable
   mapped_region &operator=(const mapped_region &);
public:

   //...
};

表示您声明了复制构造函数和赋值运算符private。这意味着您无法在彼此之间复制该类的对象。

答案 3 :(得分:1)

mapped_region(const mapped_region &); 

是复制构造函数的声明。

有时候你不希望你的课程是可复制的(所以你可以简单地通过复制另一个来创建一个对象)。默认情况下,编译器会创建复制构造函数并启用复制。为了防止编译器创建此构造函数,您需要将其声明为private并省略其定义(实现)。在这种情况下,尝试创建一个对象的副本将失败:

mapped_region mr1;
mapped_region mr2(m1); // trying to call copy constructor call - error

mapped_region mr1;
mapped_region mr2 = m1; // trying to call copy constructor call - error

评论:

// Non-copyable

应用于私有的复制构造函数声明表明其目的仅仅是为了防止编译器创建一个默认的。与operator=相同。如果两个成员都是私有的,则无法将一个对象复制或分配给另一个对象。

答案 4 :(得分:0)

请注意,当您在类的私有部分中定义复制构造函数时,您不会为其提供实现。

如果在您尝试复制的课程中,您将收到链接错误。所以

void mapped_region::f()
{
   mapped_region other(*this); // will compile because I have access to private functions
}

但代码不会链接,因为它无法找到复制构造函数定义。 (请注意,如果您这样做,可能很难找到您要复制的位置。)

禁用复制的另一种方法是从boost :: noncopyable派生你的类,因此:

class mapped_region : boost::noncopyable
{
   //etc.

};

这也可以防止复制赋值(operator =)。几乎总是当你禁止复制时,你也禁止复制。