簡體   English   中英

C ++在構造函數中定義const

[英]C++ defining const in constructor

我在第30行出現錯誤(const Date date2 = new Date(31,12,2012);)

錯誤消息是:請求從“日期*”到非標量類型“常量日期”的轉換

下面是我的源代碼:

class Date
{
private :
    int day ;
    int month ;
    int year ;
public :
    Date(){
        day = 1;
        month = 1;
        year = 2000;
    }
    Date(int d, int m, int y) : day(d), month(m), year(y){
    }
    int getDay () const { return day ;}
    int getMonth () const { return month ;}
    int getYear () const { return year ;}
};

int main ()
{
    const Date date ;
    const Date date2 = new Date(31, 12, 2012);

    cout <<"The month is "<< date.getMonth()<< endl ;
    cout << " The month is "<<date2.getMonth()<< endl ;
    return 0;
}

您需要這樣做:

const Date date2(31, 12, 2012);

在您的代碼中, const Date date2Datenew Date(31, 12, 2012); const Date date2 new Date(31, 12, 2012); 返回指向Date的指針(偶然泄漏)。

好吧,使用new返回一個您嘗試分配給非指針const變量的指針。

問題出在您的代碼中:

1.const Date date2 = new Date(31,12,2012);

在這里,你是動態分配的對象的內存Date .Operator new ,因此需要采取指針類型的對象實例將返回指針

const Date *date2 = new Date(31, 12, 2012);

2.cout <<“月是” << date2.getMonth()<< endl;

如果按點1修改代碼,則必須將上面的行更改為,因此,如果date2是指針,則需要將函數調用為:

cout <<"The month is"<<date2->getMonth()<<endl ;

3.如果要使用代碼,則只需從下面的行中刪除new代碼:

const Date date2 = Date(31, 12, 2012);

您需要將代碼修改為:

int main ()
{
    const Date date ;
    const Date *date2 = new Date(31, 12, 2012);
    cout << " The month is " << date.getMonth() << endl ;
    cout << " The month is " << date2->getMonth() << endl ;
    return 0;
}

要么

int main ()
{
    const Date date ;
    const Date date2 = Date(31, 12, 2012);
    cout << " The month is " << date.getMonth() << endl ;
    cout << " The month is " << date2.getMonth() << endl ;
    return 0;
}

operator new返回一個指針,如果您確實需要一個指針,則應使用

const Date* date2 = new Date(31,12,2012);

代替。 並且不要忘記delete date2

或者,您可以執行以下任一操作:

const Date date2(31,12,2012);

要么

const Date date2 = Date(31,12,2012);
 const Date date2 = new Date(31, 12, 2012);

此行導致錯誤,因為date2的類型為Date但是右側的結果的類型為Date* 這是因為new工作方式。

根據C ++ 11標准的5.3.4 / 2段:

由new表達式創建的實體具有動態存儲持續時間(3.7.4)。 [-]如果實體是非數組對象,則new-expression返回指向創建的對象的指針。 如果它是一個數組,則new-expression返回一個指向數組初始元素的指針。

因此,現在我們知道new在堆上為其操作數分配內存,並返回指向它的堆棧分配指針。 您可能會誤以為new會創建一個對象(如Java,JavaScript或C#),但是C ++並非如此。 為了使上面的行起作用,您必須將date2用作指針:

const Date *date2 = new Date(31, 12, 2012);

但是,創建對象的通常方法是簡單地執行以下操作(在您的情況下):

const Date date2(31, 12, 2012);

暫無
暫無

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

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