Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ 常量类成员副本构造函数 #包括“booking.h” #包括 预订::预订(常量标准::字符串p_标题,常量标准::字符串p_通知,常量类别p_类别,常量人员p_人员,常量预订::类型p_类型,常量双p_值): m_类型{p_类型}, m_title{p_title}, m_通知{p_通知}, m_person{p_person}, m_类{p_类}, m_值{p_值} { std::cout_C++_Constructor_Copy - Fatal编程技术网

C++ 常量类成员副本构造函数 #包括“booking.h” #包括 预订::预订(常量标准::字符串p_标题,常量标准::字符串p_通知,常量类别p_类别,常量人员p_人员,常量预订::类型p_类型,常量双p_值): m_类型{p_类型}, m_title{p_title}, m_通知{p_通知}, m_person{p_person}, m_类{p_类}, m_值{p_值} { std::cout

C++ 常量类成员副本构造函数 #包括“booking.h” #包括 预订::预订(常量标准::字符串p_标题,常量标准::字符串p_通知,常量类别p_类别,常量人员p_人员,常量预订::类型p_类型,常量双p_值): m_类型{p_类型}, m_title{p_title}, m_通知{p_通知}, m_person{p_person}, m_类{p_类}, m_值{p_值} { std::cout,c++,constructor,copy,C++,Constructor,Copy,您不能(合理地)分配给具有const成员的类的对象 这就是为什么会出现有关复制分配运算符的错误 你不会收到关于复制构造函数的投诉 其他消息: 在C++中,所有大写名称都是一个宏的约定。如果它们被用于其他任何东西(例如,常量,如java),那么你就增加了名字冲突和无意的文本替换的风险。此外,它是一个眼中钉,很多人都读得非常重。java没有预处理器。C++有一个。 一般来说,传递非基本类型的参数作为对const(您只添加了const)的引用是一个好主意。对于复制的大型参数,有一些额外的注意事项。

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

这就是为什么会出现有关复制分配运算符的错误

你不会收到关于复制构造函数的投诉


其他消息:

    在C++中,所有大写名称都是一个宏的约定。如果它们被用于其他任何东西(例如,常量,如java),那么你就增加了名字冲突和无意的文本替换的风险。此外,它是一个眼中钉,很多人都读得非常重。java没有预处理器。C++有一个。

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

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


<关于java启发<代码>获取< /Cord>前缀,请考虑<代码> GetSin(u)+GETCOS(V)< /C> >与<代码> Sin(u)+COS(v)在爪哇,<代码>获取< /COD>前缀对于使用内省的工具有一定的价值。java有内省。C++没有使用SturrStudio。所使用的约定应该更好地适应所使用的语言。

< P>当你声明<代码> const 成员时,编译器不会生成默认的<强>赋值运算符< /s。trong>(它不知道在赋值过程中如何处理此成员,毕竟它是常量?),您必须自己编写赋值运算符

注意:

  • 通过引用const来传递参数

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

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

如果您不声明自己的赋值运算符,编译器将为您生成一个进行成员复制的赋值运算符。但如果存在常量成员,则此操作无效,因此它毕竟无法生成赋值运算符。(在C++11中,这称为拥有已删除的赋值运算符)

最后,如果您有一些代码试图使用赋值运算符,则您在尝试使用已删除的赋值运算符时会出现此错误。某些标准库容器或算法要求存在赋值运算符。您没有显示所有代码,但在某个地方您将尝试执行一个操作that需要赋值。

引用此,对于具有常量成员的复制构造函数

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

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

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

通过常量引用传递字符串,也可能传递您的person和category。除了极少数情况外,我从不将成员变量设为常量。如果不想更改,我会将对象本身设为常量。“您必须自己编写赋值运算符”很可能,这样的运算符会非常令人惊讶,而且不应该存在。@BarryTheHatchet:是的,赋值运算符不太可能对具有
const
数据成员的类有意义,但也有一些情况。例如,为
std::vector
编制索引时,会生成一个可以分配给的代理,以便更改位集状态。我不知道它是否有
const
成员,但它可能有。而且仍然有意义。@Cheers-Sandhth.-Alf:当然,这是可能的,这就是我说“最有可能”的原因虽然不推荐使用
std::vector
作为类设计的一个示例:PMeh,我对枚举键和非宏
const
使用所有大写。这是一个品味问题。我承认这有点傻,因为存在冲突风险。“在C++11中,这些都是按值传递和移动的最佳方式。”仅当您不再需要原始参数时……如果函数只观察值,则总体而言,通过常量引用传递仍然是非常可取的。@BarryTheHatchet:对于要复制的大型参数,使用ref-to-const形式参数类型也有一些正当的理由。但是,“仅[通过值传递并移动]“当你不再需要原件”不是这样的理由。因为它没有意义(对实际论点没有影响),抱歉。这肯定是一个原因,因为如果您仍然需要原始文件,那么传递值和移动将完全破坏您的程序。抱歉。@MikeMB:噢,天哪。不,我当然不知道。谢谢链接。
#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;

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