求助,关于C++重载问题?

帕奇笔记 2014-03-18 06:23:50
#include<iostream>
using namespace std;

class Rectangle
{
private:
double length,width;
public:
Rectangle(); //声明无参数的构造函数
Rectangle(double a,double b); //声明带两个参数的构造函数
void area();
};

Rectangle::Rectangle()
{
length=1;
width=1;
}

Rectangle::Rectangle(double a=1,double b=1)
{
length=a;
width=b;
}

void Rectangle::area()
{
cout<<"面积是:"<<length*width<<endl;
}

int main()
{
Rectangle rect1;
rect1.area();

Rectangle rect2(5,6);
rect2.area();
system("pause");
return 0;
}



'Rectangle::Rectangle' : ambiguous call to overloaded function这是vc++6.0出现的错误
我是照着书搬的,哪儿错了吗?还是vc6.0的问题
...全文
177 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
turing-complete 2014-03-23
  • 打赏
  • 举报
回复
小建议: 默认形参值,最好放到函数的声明处(也就是类中)。
ErrorErro 2014-03-23
  • 打赏
  • 举报
回复
你有参的函数是带有默认参数的,如果在调用时没有传递参数就会产生歧义,不会让你编译通过的……
既然楼主都用了默认参数了,就把无参的构造函数删掉吧
wzhang912 2014-03-22
  • 打赏
  • 举报
回复
呵呵,楼主你好幽默。
hyq_1756 2014-03-22
  • 打赏
  • 举报
回复
你让编译器纠结,编译器就让你纠结~~~~~!~~
hyq_1756 2014-03-22
  • 打赏
  • 举报
回复
说白了,编译器不知道该选哪个了!
sjtcumt 2014-03-22
  • 打赏
  • 举报
回复
引用C++primer(第四版)第218页,

string screenInit(string::size_type height = 24,
                               string::size_type width =80,
                               char background = ' ')
string screen;
screen = screenInit(); //equivalent to screeenInit(24,80,' ')



所以,我认为你的两个函数是重定义的
落单的毛毛虫 2014-03-22
  • 打赏
  • 举报
回复
你的定义让编译器看不懂. 带默认参数的函数跟不带参数的函数在不带参数调用的时候分不出来.
FancyMouse 2014-03-22
  • 打赏
  • 举报
回复
两个都省了,就不觉得会和无参数歧义?
帕奇笔记 2014-03-22
  • 打赏
  • 举报
回复
Rectangle::Rectangle(double a=1,double b=1) { length=a; width=b; } 在没有Rectangle(); //声明无参数的构造函数 的情况下,上面的语句不就是带有默认参数的构造函数吗? 为什么当两者同时出现时却不行了。 我是参考《由浅入深C++》里面的代码的,只不过书里在这段里,只有 (double a,double b=1) 我是想知道,为什么第一个参数 a不带默认参数,仅仅b带有默认参数时,和Rectangle()重载不发生问题? 这是书上原版的内容,求解释? #include<iostream> using namespace std; class Rectangle { private: double length,width; public: Rectangle(); //声明无参数的构造函数 Rectangle(double a,double b); //声明带两个参数的构造函数 void area(); }; Rectangle::Rectangle() { length=1; width=1; } Rectangle::Rectangle(double a ,double b = 5) { length=a; width=b; } void Rectangle::area() { cout<<"面积是:"<<length*width<<endl; } int main() { Rectangle rect1; rect1.area(); Rectangle rect3(3); rect3.area(); Rectangle rect2(5,6); rect2.area(); system("pause"); return 0; }
bedynamic 2014-03-18
  • 打赏
  • 举报
回复
引用 1 楼 JiMoKuangXiangQu 的回复:
#include<iostream>
using namespace std;

class Rectangle
{
private:
	double length,width;
public:
	Rectangle();	 //声明无参数的构造函数
	Rectangle(double a,double b);	 //声明带两个参数的构造函数
	void area();
};

Rectangle::Rectangle()
{
	length=1;
	width=1;
}

Rectangle::Rectangle(double a/*=1*/,double b/*=1*/)
{
	length=a;
	width=b;
}

void Rectangle::area()
{
	cout<<"面积是:"<<length*width<<endl;
}

int main()
{
	Rectangle rect1;
	rect1.area();

	Rectangle rect2(5,6);
	rect2.area();
	system("pause");
	return 0;
}
楼主别这么人才好不……不带这么玩的Rectangle::Rectangle(double a=1,double b=1),我一开始还没注意……细看了一下才发现,函数参数不是这么带的!!!!
max365well 2014-03-18
  • 打赏
  • 举报
回复
默认构造函数(default constructor)就是在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。如果定义某个类的变量时没有提供初始化式就会使用默认构造函数。(来自:百度百科) 所以,你定义了两个默认构造函数~ LSS是对的。或者删掉无参的那个,改下另一个也行。 新手拙见,求指导~
spaceman10 2014-03-18
  • 打赏
  • 举报
回复
看下《effective c++》
JiMoKuangXiangQu 2014-03-18
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

class Rectangle
{
private:
	double length,width;
public:
	Rectangle();	 //声明无参数的构造函数
	Rectangle(double a,double b);	 //声明带两个参数的构造函数
	void area();
};

Rectangle::Rectangle()
{
	length=1;
	width=1;
}

Rectangle::Rectangle(double a/*=1*/,double b/*=1*/)
{
	length=a;
	width=b;
}

void Rectangle::area()
{
	cout<<"面积是:"<<length*width<<endl;
}

int main()
{
	Rectangle rect1;
	rect1.area();

	Rectangle rect2(5,6);
	rect2.area();
	system("pause");
	return 0;
}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧