C++:不存在默认构造函数?
代码如下//head.h#include<iostream>#include<cmath>usingnamespacestd;classpoint{friendclass...
代码如下
//head.h
#include<iostream>#include<cmath>using namespace std;class point{friend class dis;private: int X; int Y;public: point(int x,int y) {X=x;Y=y;} void show() {cout<<X<<","<<Y<<endl;}};class dis{private: point A; point B;public: dis(point a,point b) {A=a;B=b;} void showdis() {cout<<sqrt(double((A.X-B.X)*(A.X-B.X)+(A.Y-B.Y)*(A.Y-B.Y)))<<endl;}};
错误图片如下:
就算是我初始值,那还是同样的错误
point(int x,int y):X(0),Y(0)
{X=x;Y=y;}
为什么改成
point(int x=0,int y=0) {X=x;Y=y;}
就可以了呢》我是初学者 展开
//head.h
#include<iostream>#include<cmath>using namespace std;class point{friend class dis;private: int X; int Y;public: point(int x,int y) {X=x;Y=y;} void show() {cout<<X<<","<<Y<<endl;}};class dis{private: point A; point B;public: dis(point a,point b) {A=a;B=b;} void showdis() {cout<<sqrt(double((A.X-B.X)*(A.X-B.X)+(A.Y-B.Y)*(A.Y-B.Y)))<<endl;}};
错误图片如下:
就算是我初始值,那还是同样的错误
point(int x,int y):X(0),Y(0)
{X=x;Y=y;}
为什么改成
point(int x=0,int y=0) {X=x;Y=y;}
就可以了呢》我是初学者 展开
8个回答
展开全部
point类中你定义了构造函数 point(int x,int y){X=x;Y=y;},这样系统就不会再提供默认的构造函数point(){},而没有了point(){}这个构造函数,dis类中的构造函数dis(point a,point b)中,参数a和b的构造自然会失败(类中没有对应的无参构造函数)。
追问
可是,如果在main函数中执行
point a,b;
a=b;
这些让point两个对象相等的命令也是可以执行的啊,怎么就没有复制构造函数呢?
追答
不应该的,point a,b;这句话编译时,编译器就应该提示你没有可用的构造函数了,也就是说当你在类中没写任何的构造函数,系统会提供一个无参的构造函数,此时point a;这样的定义是合法的,但当你定义了point(int x,int y){X=x;Y=y;}时,系统就不会再为你准备默认构造函数,此时point a;这样的定义格式,系统就找不到与之匹配的构造函数,就编译出错了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是因为你定义point的构造时没有定义默认构造函数,所以,如果你一定要用point(int x,int y){X = x; Y = y;}
那么可以改成这样point( int x = 0, int y = 0){X = x; Y = y;},这样定义后,你的A= a ;就不会报错了。最好在point构造函数后加一下point operator = ( const point & p ){ X = p.X; Y = p.Y; return *this; },这样就用担心调用拷贝对象时出错了。C++ 语法是这样说的,如果没有定义构造函数,编译器会提供默认构造,但是,如果自己定义了构造函数,编译系统将不在为该类提供默认构造函数。
那么可以改成这样point( int x = 0, int y = 0){X = x; Y = y;},这样定义后,你的A= a ;就不会报错了。最好在point构造函数后加一下point operator = ( const point & p ){ X = p.X; Y = p.Y; return *this; },这样就用担心调用拷贝对象时出错了。C++ 语法是这样说的,如果没有定义构造函数,编译器会提供默认构造,但是,如果自己定义了构造函数,编译系统将不在为该类提供默认构造函数。
追问
默认构造函数不是已经有了么?
point(int x,int y)
{X=x;Y=y;}
这个不就是构造函数了?默认?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
dis() {} 的构造函数一定有的。这个构造函数不存在默认,但是存在默认其他构造函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
point(int x,int y)
改成
point(int x = 0,int y = 0)
或者在这前面添加一句
point(){}
改成
point(int x = 0,int y = 0)
或者在这前面添加一句
point(){}
追问
真的可以啊!可是为什么这样的呢?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询