搜尋

首頁  >  問答  >  主體

c++自定义无参构造函数后 ,定义一个该类的对象时显示,多个默认构造函数,什么原因呢?

1,c++自定义无参构造函数后 ,定义一个该类的对象时显示,多个默认构造函数,什么原因呢?
2,相关代码如下:

include<iostream>

using namespace std;
class point
{
public:

point();
point(int xx, int yy);


int getx()
{
    return x;
}
int gety()
{
    return y;
}

private:

int x;
int  y;

};
point::point(int xx = 0, int yy = 0)
{

x = xx;
y = yy;

}

point::point()
{

x = 0;
y = 0;

}
int main()
{

point a;       ***//出现编译错误***
point b(1, 2);

}

运行后,point a;这句代码编译出错

错误如下:
严重性 代码 说明 项目 文件 行
错误 C2668 “point::point”: 对重载函数的调用不明确 JD_EX e:c++primerjd_exjd_ext11.cpp 39

严重性 代码 说明 项目 文件 行
错误(活动) 类 "point" 包含多个默认构造函数 JD_EX e:c++primerJD_EXJD_EXt11.cpp 39

是需要自己定义一个默认构造函数,point()=defaul:吗?那这个无参的构造函数,该怎么调用呢?
谢谢大神 ,麻烦帮忙解答。。

PHP中文网PHP中文网2814 天前648

全部回覆(2)我來回復

  • 阿神

    阿神2017-04-17 14:40:30

    class Point
    {
        int x;
        int y;
        public:
        //这样写的话,直接Point test;可以调用下面的这个构造函数,因为有默认参数值啊
        //但是如果你还有无参数的构造函数,编译器就会报错,告诉你有歧义
        Point(int a = 0, int b = 0) :
        x(a), y(b) {}
        
        /* 这和上面那个构造函数会在用Point test;定义对象时,产生歧义,因为都可以不用参数啊。
        Point() {}
        
        这和上面那个差不多
        Point() = default;
        */
    };
    

    更多關於default的知識,可以參考這個鏈接,簡單說了一下。 http://stackoverflow.com/ques...


    下次提問後,看看版面啊。 。 。 。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 14:40:30

    point::point(int xx = 0, int yy = 0)
    {

    x = xx;
    y = yy;
    }
    因為你的這個建構子有預設形參,可以當作無參數的建構子用,所以你再定義一個無參數的構造函數就是重載失敗。而你一旦定義了建構函數,編譯器是不會再合成預設的構造函數。把Point()拿掉即可,多餘了。
    僅供參考。

    回覆
    0
  • 取消回覆