C ++在构造函数中定义const

时间:2013-05-27 14:09:15

标签: c++ constructor const

我在第30行遇到错误(const Date date2 = new Date(2012年12月31日);)

错误讯息是: 从'Date *'转换为非标量类型'const Date'请求

以下是我的源代码:

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

5 个答案:

答案 0 :(得分:6)

你需要这样做:

const Date date2(31, 12, 2012);

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

答案 1 :(得分:1)

好吧,使用new会返回一个指针,您尝试将其指定给非指针const变量。

答案 2 :(得分:1)

问题在于您的代码:

1.const日期date2 =新日期(2012年3月31日);

在这里,您为对象Date动态分配内存。运算符new将返回指针,以便您需要接收对象示例的指针类型

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

2.cout&lt;&lt; “月份是”&lt;&lt; date2.getMonth()&LT;&LT;结束;

如果按照第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;
}

答案 3 :(得分: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);

答案 4 :(得分:0)

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

此行会导致错误,因为date2的类型为Date,但右侧的结果的类型为Date*。这是因为new的工作方式。

根据C ++ 11标准的第5.3.4 / 2段:

  

new-expression创建的实体具有动态存储持续时间(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);