[英]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 date2
是Date
而new 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.