Const类成员复制构造函数

时间:2014-09-30 23:34:14

标签: c++ constructor copy

#include "booking.h"
#include <iostream>
booking::booking (  const std::string p_title,  const std::string p_notice,  const category p_category,  const person p_person,  const booking::Type p_type,  const double p_value ) :
m_type{ p_type },
m_title{ p_title },
m_notice{ p_notice },
m_person{ p_person },
m_category{ p_category },
m_value { p_value }
{
    std::cout << "Booking was created" << std::endl; // Debug Message
}

这些是文件(我认为必须知道的一切)

#pragma once
#include <string>
#include "person.h"
#include "category.h"
class booking
{
public:
    enum Type { TYPE_REVENUE, TYPE_EXPENDITURE };
    booking ( const std::string p_title, const std::string p_notice, const category p_category, const person p_person, const booking::Type p_type, const double p_value ); //Basic Constructor
    ~booking();
    Type GetType ( );
    std::string GetTitle ( );
    std::string GetNotice ( );
    category GetCategory ( );
    double GetValue ( );

private:
     Type m_type;
     std::string m_title;
     std::string m_notice;
     category m_category;
     person m_person;
     double m_value;

};

如果我将其中一个类成员(如m_type或double值,无关紧要)转换为const,则会抛出以下错误:

  

Fehler 1错误C2280:booking &booking::operator =(const booking &):尝试引用已删除的函数C:\ Program Files(x86)\ Microsoft Visual C ++编译器2013年11月CTP \ include \ utility 53

我不明白为什么编译器抱怨复制构造函数,基本上是什么问题。

4 个答案:

答案 0 :(得分:3)

您无法(合理地)分配给拥有const成员的班级的对象。

这就是为什么您收到有关复制赋值运算符的错误的原因。

您没有收到有关复制构造函数的投诉。


在其他新闻中:

  • 在C ++中,所有大写名称都是宏的约定。如果它们被用于其他任何东西(例如常量,如在Java中),则会增加名称冲突和无意中文本替换的风险。除了它是一个眼睛,许多人认为是非常重视。 Java没有预处理器。 C ++确实有一个。

  • 一般来说,传递非基本类型参​​数作为对const的引用是个好主意(您只添加了const)。复制的大型参数还有一些额外的注意事项。在C ++ 11中,这些最好按值传递并移动。

  • 简单&#34; getter&#34;应该声明成员函数const,以便可以在const对象上调用它们。

关于受Java启发的Get前缀,请考虑GetSin(u)+GetCos(v)sin(u)+cos(v)。在Java中,Get前缀对于使用内省的工具具有一定的价值。 Java有内省。 C ++没有自省。所采用的惯例应更好地适应所使用的语言。

答案 1 :(得分:3)

引用此thread,关于具有const成员的复制构造函数,

复制构造函数的一般形式是

class Foo {
Foo( const Foo& f ) :
  mem1( f.mem1 ), mem2( f.mem2 ) /* etc */
{}
};

其中mem1和mem2是Foo的数据成员,可以是const 成员,非const成员,const引用或非const引用。

答案 2 :(得分:2)

当你声明一个const成员时,编译器不生成默认的赋值运算符(它不知道在赋值期间该成员该怎么做,毕竟它是const ?),你必须自己编写赋值运算符。

注意:

  • 通过引用传递参数const。

答案 3 :(得分:1)

operator=不是复制构造函数,而是赋值运算符

const个对象无法更新,因此在赋值运算符中无法修改对象。

如果您没有声明自己的赋值运算符,编译器会为您生成一个执行成员复制的运算符。但是如果有一个const成员,这不起作用,所以它毕竟不能生成赋值运算符。 (在C ++ 11中,这被称为具有已删除赋值运算符)。

最后,如果您有一些尝试使用赋值运算符的代码,那么您会收到有关尝试使用已删除赋值运算符的错误。一些标准库容器或算法要求赋值运算符存在。您没有显示所有代码但在某处您将尝试执行需要分配的操作。