const 类成员复制构造函数

use*_*058 6 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
}
Run Code Online (Sandbox Code Playgroud)

这些是文件(我认为必须知道的所有内容)

#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;

};
Run Code Online (Sandbox Code Playgroud)

如果我将类成员之一(如 m_type 或 double 值,哪个无关紧要)放入 const,它会引发以下错误:

Fehler 1 错误 C2280::booking &booking::operator =(const booking &)试图引用已删除的函数 C:\Program Files (x86)\Microsoft Visual C++ Compiler Nov 2013 CTP\include\utility 53

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

Che*_*Alf 6

您不能(合理地)分配给具有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++ 没有内省。所采用的约定应该更好地适应所使用的语言。


qua*_*dev 5

当你声明一个const成员时,编译器不会生成默认的赋值运算符(它不知道赋值时对这个成员做什么,毕竟它是const?),你将不得不自己编写赋值运算符。

笔记:

  • 通过引用 const 来传递参数。


M.M*_*M.M 5

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

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

如果您没有声明自己的赋值运算符,编译器会为您生成一个进行成员复制的赋值运算符。但如果有 const 成员,这就不行了,所以它终究无法生成赋值运算符。(在 C++11 中,这称为删除赋值运算符)。

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