簡體   English   中英

常量類成員副本構造函數

[英]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?),您將必須自己編寫賦值運算符。

注意:

  • 通過引用const傳遞參數。

operator=不是復制構造函數,它是賦值運算符

const對象無法更新,因此在您的賦值運算符中,您無法修改對象。

如果您未聲明自己的賦值運算符,則編譯器會為您生成一個執行成員明智的復制。 但是,如果有一個const成員,那么它將無法正常工作,因此它畢竟無法生成賦值運算符。 (在C ++ 11中,這被稱為具有刪除的賦值運算符)。

最后,如果您有一些嘗試使用賦值運算符的代碼,則會收到有關嘗試使用已刪除的賦值運算符的錯誤。 一些標准庫容器或算法需要使用賦值運算符。 您並沒有顯示所有代碼,但是您嘗試在某個地方執行需要分配的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM