[英]Const Class Member Copy Constructor
#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
我不明白為什么編譯器會抱怨復制構造函數,而本質上是什么問題。
您不能(合理地)分配給具有const
成員的類的對象。
這就是為什么您會收到有關副本分配運算符的錯誤的原因。
您不會對副本構造函數有所抱怨。
在其他新聞中:
在C ++中,所有大寫名稱都是宏的約定。 如果將它們用於其他任何用途(例如,常量,例如Java中的常量),則可能增加名稱沖突和文本替換的風險。 除了令人眼花ore亂之外,許多人還把閱讀重點放在了重點上。 Java沒有預處理器。 C ++確實有一個。
通常將非基本類型的參數作為對const
引用(最好只添加const
),這是一個好主意。 對於復制的大型參數,還有一些其他注意事項。 在C ++ 11中,最好按值傳遞和移動它們。
應該將簡單的“ getter”成員函數聲明為const
以便可以在const
對象上調用它們。
關於受Java啟發的Get
前綴,請考慮GetSin(u)+GetCos(v)
與sin(u)+cos(v)
。 在Java中, Get
前綴對於使用自省的工具可以具有一些價值。 Java具有自省性。 C ++沒有內省。 所采用的約定應更好地適應所使用的語言。
引用此線程 ,以引用具有const成員的副本構造函數,
復制構造函數的一般形式是
class Foo {
Foo( const Foo& f ) :
mem1( f.mem1 ), mem2( f.mem2 ) /* etc */
{}
};
其中mem1和mem2是Foo的數據成員,可以是const成員,非const成員,const引用或非const引用。
當您聲明const
成員時,編譯器不會生成默認的賦值運算符 (它不知道在賦值過程中與此成員有什么關系,畢竟它是const?),您將必須自己編寫賦值運算符。
注意:
operator=
不是復制構造函數,它是賦值運算符 。
const
對象無法更新,因此在您的賦值運算符中,您無法修改對象。
如果您未聲明自己的賦值運算符,則編譯器會為您生成一個執行成員明智的復制。 但是,如果有一個const成員,那么它將無法正常工作,因此它畢竟無法生成賦值運算符。 (在C ++ 11中,這被稱為具有刪除的賦值運算符)。
最后,如果您有一些嘗試使用賦值運算符的代碼,則會收到有關嘗試使用已刪除的賦值運算符的錯誤。 一些標准庫容器或算法需要使用賦值運算符。 您並沒有顯示所有代碼,但是您嘗試在某個地方執行需要分配的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.