这个可以是默认构造函数吗?

jodelle 2010-01-15 09:15:18
item(const std::string &book=" "):isbn(book),sold(0){}

如果类定义中只有这个构造函数 他是默认构造函数吗,如果还有个构造函数 item(){},是否重复定义了构造函数,到底什么样的构造函数才是默认构造函数,望大家解答下
...全文
203 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhjun087 2010-01-16
  • 打赏
  • 举报
回复
有参数,不是
eatsweetpotato 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 lovesi3344 的回复:]
回21楼
这个我知道
但是楼主的15楼的程序还没调用就已经说二义性了(类声明中)

[/Quote]

这只能说明LZ用的编译器好,给出了警告
耍宝王 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jodelle 的回复:]
关键这2个都是默认构造函数 Item it;应该调用哪个呢?应该是有二义性
[/Quote]
#include <string>

class Item{
public:
Item(const std::string& book=" "):isbn(book),sold(0){}//问题出在string& book=" "这里,在调用时形式上是和Item()一样的,因为你指定了默认值
//改成Item(const std::string& book):isbn(book),sold(0){}就可以了
Item(){}//这才是默认构造函数
private:
std::string isbn;
int sold;
};
jodelle 2010-01-15
  • 打赏
  • 举报
回复
回22楼 类声明中编译器警告有重复定义默认构造函数,如果我加个Item it;编译时报错error C2668: 'Item::Item' : ambiguous call to overloaded function有二义性
lovesi3344 2010-01-15
  • 打赏
  • 举报
回复
回21楼
这个我知道
但是楼主的15楼的程序还没调用就已经说二义性了(类声明中)
arong1234 2010-01-15
  • 打赏
  • 举报
回复
当然有二义性了,这是你对理论理解不透!
二义性并不是直接比较signature的,而是如果一个表达式可以匹配到两个或者更多的函数时,就会报二义性的。
如果我定义下面的对象
Item anItem;

编译器会发现
Item(const std::string& book=" ") 和Item()都可以构造上述对象,因此它不知道哪个应该被使用,这就是二义性


[Quote=引用 19 楼 lovesi3344 的回复:]
二义性了?
理论与实际不符


引用 15 楼 jodelle 的回复:
嗯 编译
#include <string>
class Item{
public:
Item(const std::string& book=" "):isbn(book),sold(0){}
Item(){}
private:
std::string isbn;
int sold;
};
提示warning C4520: 'Item' : multiple default constructors specified

[/Quote]
jodelle 2010-01-15
  • 打赏
  • 举报
回复
回17楼 我的意思是如果一个构造函数有参数,但每个参数都有默认实参,那么它应该也是默认构造函数,那么和没有参数的构造函数就构成了2义性。
lovesi3344 2010-01-15
  • 打赏
  • 举报
回复

二义性了?
理论与实际不符


[Quote=引用 15 楼 jodelle 的回复:]
嗯 编译
#include <string>
class Item{
public:
Item(const std::string& book=" "):isbn(book),sold(0){}
Item(){}
private:
std::string isbn;
int sold;
};
提示warning C4520: 'Item' : multiple default constructors specified
[/Quote]
jodelle 2010-01-15
  • 打赏
  • 举报
回复
关键这2个都是默认构造函数 Item it;应该调用哪个呢?应该是有二义性
耍宝王 2010-01-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lovesi3344 的回复:]
是的
是程序员自己提供的默认构造函数,而不是系统提供的
系统提供的默认构造函数是没有参数也没有定义任何行为的(空的圆括号和空的花括号)
而程序员提供的默认构造函数可以没有参数,也可以所有参数都有默认值。

引用 6 楼 jodelle 的回复:
o ,那item(const std::string &book=" "):isbn(book),sold(0){}也应该是默认构造函数吧

[/Quote]
不是的
#include <iostream>
using namespace std;

class A{
public:
A(int n);
int i;
};

A::A(int n){
i = n;
}

class B: public A{
public:
int m;
};

int main()
{
B b;//无法编译,提示未找A的默认构造函数
cout << b.m << endl;
return 0;
}

应该改成
#include <iostream>
using namespace std;

class A{
public:
A();//可以不去实现,编译不会出错,但是生成程序时连接会出错
A(int n);
int i;
};

A::A(){
i = 1;
}

A::A(int n){
i = n;
}

class B: public A{
public:
int m;
};

int main()
{
B b;
cout << b.m << endl;
return 0;
}
Devilsbibble 2010-01-15
  • 打赏
  • 举报
回复
重载不就行了,使用不同的参数名或类型
jodelle 2010-01-15
  • 打赏
  • 举报
回复
嗯 编译
#include <string>
class Item{
public:
Item(const std::string& book=" "):isbn(book),sold(0){}
Item(){}
private:
std::string isbn;
int sold;
};
提示warning C4520: 'Item' : multiple default constructors specified
lovesi3344 2010-01-15
  • 打赏
  • 举报
回复
没有二义性,你可以试试
因为特征标(函数参数表)不同,一个有参数,一个没参数,参数个数不同,构成函数重载
属于函数重载

[Quote=引用 12 楼 jodelle 的回复:]
还有个问题 如果item(const std::string &book=" "):isbn(book),sold(0){}是默认构造函数,再定义item(){}
是否重复定义了默认构造函数?
[/Quote]
eatsweetpotato 2010-01-15
  • 打赏
  • 举报
回复
那就二义性
jodelle 2010-01-15
  • 打赏
  • 举报
回复
还有个问题 如果item(const std::string &book=" "):isbn(book),sold(0){}是默认构造函数,再定义item(){}
是否重复定义了默认构造函数?
lty0709 2010-01-15
  • 打赏
  • 举报
回复
好想不是的啊~~
耍宝王 2010-01-15
  • 打赏
  • 举报
回复
item()这种形式就叫做默认构造函数,可以自己定义,也可以在满足下面这个条件是让编译器合成
未定义其它构造函数时一个默认构造函数

同时,C++里面有一个函数重载的概念,只要,参数个数或类型不同,可以同时存在多个同名函数(包括构造函数,不包括析构函数,或者说析构函数就一个形式)
item();//默认构造函数
item(int i);
item(int i, int n);
item(char c);
//可以同时存在
jodelle 2010-01-15
  • 打赏
  • 举报
回复
ok,终于搞明白了 谢谢
lovesi3344 2010-01-15
  • 打赏
  • 举报
回复
是的
是程序员自己提供的默认构造函数,而不是系统提供的
系统提供的默认构造函数是没有参数也没有定义任何行为的(空的圆括号和空的花括号)
而程序员提供的默认构造函数可以没有参数,也可以所有参数都有默认值。

[Quote=引用 6 楼 jodelle 的回复:]
o ,那item(const std::string &book=" "):isbn(book),sold(0){}也应该是默认构造函数吧
[/Quote]
lovesi3344 2010-01-15
  • 打赏
  • 举报
回复
默认构造函数要么没有参数,要么所有参数都有默认值

楼主很有可能是对的
即楼主提供的函数是默认构造函数
因为都是默认值

[Quote=引用楼主 jodelle 的回复:]
item(const std::string &book=" "):isbn(book),sold(0){}

如果类定义中只有这个构造函数 他是默认构造函数吗,如果还有个构造函数 item(){},是否重复定义了构造函数,到底什么样的构造函数才是默认构造函数,望大家解答下
[/Quote]
加载更多回复(6)

64,639

社区成员

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

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