Const 类成员复制构造函数


#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 或双精度值,哪个都无关紧要(放入 const,它会抛出以下错误:

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

我不明白为什么编译器抱怨复制构造函数以及基本上是怎么回事。

您不能(合理地(分配给具有const成员的类的对象。

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

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


在其他新闻中:

  • 在C++所有大写名称都是宏的约定。如果它们用于其他任何用途(例如常量,如在 Java 中(,那么会增加名称冲突和无意文本替换的风险。此外,这是一个碍眼的东西,被许多人解读为额外的强调。Java没有预处理器。C++确实有一个。

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

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

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

当你声明一个const成员时,编译器不会生成一个默认的赋值运算符(它不知道在赋值过程中如何处理这个成员,毕竟它是常量?(,你必须自己编写赋值运算符。

注意:

  • 通过引用将参数传递给 const。
operator=不是

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

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

如果不声明自己的赋值运算符,编译器会为您生成一个按成员复制的赋值运算符。但是,如果存在 const 成员,则这不起作用,因此它毕竟无法生成赋值运算符。(在 C++11 中,这称为具有已删除的赋值运算符(。

最后,如果您有一些代码尝试使用赋值运算符

,则会收到有关尝试使用已删除赋值运算符的错误。 某些标准库容器或算法需要存在赋值运算符。您没有显示所有代码,但是您将尝试在某个地方执行需要赋值的操作。

引用这个线程,关于带有 const 成员的复制构造函数,

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

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

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

最新更新