求助,关于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的问题
...全文
183 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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;
}
适合新手的教程,我自己也在学,以下是部分学习笔记 69 函数指针 70 动态内存分配 Dynamic memory pointer = new type pointer = new type [elements] 第一个表达式用来给一个单元素的数据类型分配内存。第二个表达式用来给一个数组分配内存。 例如: int * bobby; bobby = new int [5]; if (bobby == NULL) { // error assigning memory. Take measures. }; delete pointer; delete [ ] pointer; 在C语言中,为了动态分配内存,我们必须求助于函数库stdlib.h 因为该函数库在C++中仍然有效,并且在一些现存的程序仍然使用,所以我们下面将学习一些关于这个函数库中的函数用法。 函数malloc void * malloc (size_t nbytes); char * cp; cp = (char *) malloc (10); int * bobby; bobby = (int *) malloc (5 * sizeof(int)); 这一小段代码将一个指向可存储5个int型整数的内存块的指针赋给bobby,它的实际长度可能是 2,4或更多字节 数,取决于程序是在什么操作系统下被编译的。 int * bobby; bobby = (int *) calloc (5, sizeof(int)); malloc 和calloc的另一点不同在于calloc 会将所有的元素初始化为0。 它被用来改变已经被分配给一个指针的内存的长度。 void * realloc (void * pointer, size_t size); 参数pointer 用来传递一个已经被分配内存的指针或一个空指针,而参数size 用来指明新的内存长度。这个函数 给指针分配size 字节的内存。这个函数可能需要改变内存块的地址以便能够分配足够的内存来满足新的长度要 求。在这种情况下,指针当前所指的内存中的数据内容将会被拷贝到新的地址中,以保证现存数据不会丢失。函 数返回新的指针地址。如果新的内存尺寸不能够被满足,函数将会返回一个空指针,但原来参数中的指针 pointer 及其内容保持不变。 函数 free 这个函数用来释放被前面malloc, calloc 或realloc所分配的内存块。 void free (void * pointer); 注意:这个函数只能被用来释放由函数malloc, calloc 和realloc所分配的空间。 74 数据结构 76-78 结构指针(Pointers to structures) -> 这是一个引用操作符,常与结构或类的指针一起使用,以便引用其中的成员元素,这样就避免使用很多括号。例如,我们用: pmovie->title 来代替: (*pmovie).title 79 自定义数据类型(User defined data types) typedef existing_type new_type_name; typedef char C; typedef unsigned int WORD; typedef char * string_t; typedef char field [50]; 80 联合(Union) union mytypes_t { char c; int i; float f; } mytypes; 81 枚举Enumerations (enum) enum model_name { value1, value2, value3, . . } object_name; 例如,我们可以定义一种新的变量类型叫做color_t 来存储不同的颜色: enum colors_t {black, blue, green, cyan, red, purple, yellow, white}; 注意在这个定义里我们没有使用任何基本数据类型。换句话说,我们创造了一种的新的数据类型,而它并没有基 于任何已存在的数据类型:类型color_t,花括号{}中包括了它的所有的可能取值。例如,在定义了colors_t 列举 类型后,我们可以使用以下表达式: 84 类(Class) 类(class)是一种将数据和函数组织在同一个结构里的逻辑方法。定义类的关键字为class ,其功能与C语言中的struct类似,不同之处 是class可以包含函数,而不像struct只能包含数据元素。 类定义的形式是: class class_name { permission_label_1: member1; permission_label_2: member2; ... } object_name; 其中 class_name 是类的名称 (用户自定义的类型) ,而可选项object_name 是一个或几个对象(object)标识。Class的声明体中包含 成员members,成员可以是数据或函数定义,同时也可以包括允许范围标志 permission labels,范围标志可以是以下三个关键字中 任意一个:private:, public: 或 protected:。它们分别代表以下含义: ● private :class的private成员,只有同一个class的其他成员或该class的“friend” class可以访问这些成员。 ● protected :class的protected成员,只有同一个class的其他成员,或该class的“friend” class,或该class的子类(derived classes) 可以访问这些成员。 ● public :class的public成员,任何可以看到这个class的地方都可以访问这些成员。 如果我们在定义一个class成员的时候没有声明其允许范围,这些成员将被默认为 private范围。 以下是怎样读前面例子中出现的一些指针和类操作符 (*, &, ., ->, [ ]): ● *x 读作: pointed by x (由x指向的) ● &x 读作: address of x(x的地址) ● x.y 读作: member y of object x (对象x的成员y) ● (*x).y 读作: member y of object pointed by x(由x指向的对象的成员y) ● x->y 读作: member y of object pointed by x (同上一个等价) ● x[0] 读作: first object pointed by x(由x指向的第一个对象) ● x[1] 读作: second object pointed by x(由x指向的第二个对象) ● x[n] 读作: (n+1)th object pointed by x(由x指向的第n+1个对象) 由关键字struct和union定义的类 类不仅可以用关键字class来定义,也可以用struct或union来定义。 因为在C++中类和数据结构的概念太相似了,所以这两个关键字struct和class的作用几乎是一样的(也就是说在C++中struct定义的 类也可以有成员函数,而不仅仅有数据成员)。两者定义的类的唯一区别在于由class定义的类所有成员的默认访问权限为private,而 struct定义的类所有成员默认访问权限为public。除此之外,两个关键字的作用是相同的。 union的概念与struct和class定义的类不同, 因为union在同一时间只能存储一个数据成员。但是由union定义的类也是可以有成员函 数的。union定义的类访问权限默认为public。 94 操作符重载(Overloading operators) + - * / = < > += -= *= /= << >> <<= >>= == != <= >= ++ -- % & ^ ! | ~ &= ^= |= && || %= [] () new delete 96 this指针 97 静态成员(静态变量、静态函数)(Static members) 静态成员类直接访问,不属于类对象的成员 98 类之间的关系(Relationships between classes) 友元函数(Friend functions) 101 类的继承 记住,this 代表代码正在被执行的这一个对象的指针。 142 函数模块 154 出错处理 (Exception handling) 159 类型转换高级 (Advacned Class Type-casting) 163 typeid 164 预处理指令 168 标准函数库

65,187

社区成员

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

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