关于struct 和class的区别

勤奋的小游侠 2011-10-11 11:43:28
书上说strcut 和class就成员的默认访问属性不同,一个是public,一个是private.
但刚在VS上试了一下以下两个代码

struct a{
void f(int c){printf("int");};
void f(double c){printf("double");};};

class b{
void f(int c){printf("int");};
void f(double c){printf("double");};};
a完全没有问题,b则编译不过,重定义。谁能解释一下吗?struct和class还有什么区别?书上说的全是坑爹的。
...全文
226 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
勤奋的小游侠 2011-10-14
  • 打赏
  • 举报
回复
明白了,是我搞错了。好,结帖了
scutth 2011-10-12
  • 打赏
  • 举报
回复
C++里面有精准匹配的准则:
比如f(int)和f(double),如果定义一个变量int a,调用f(a),编译器会查看a的类型,如果f函数有此类型的版本,则调用之(称为精准匹配),否则会发生类型提升实现匹配,因此如果同时定义了int和double两者形参类型的f(),系统也会调用int版本。如果没定义int版本,就会调用可以转换类型形参的f(),也就是double类型的。
pathuang68 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 keiy 的回复:]

引用 10 楼 lovesmiles 的回复:
int 和double 不是可以默认转换的吗?

可以,但如果你显式定义了二个函数,它会调用不同的
a a1;
a1.f(0); //调用int
a1.f(0.0); //调用double
如果你没定义其中一个,就会隐式转换
[/Quote]
++
f(int)和f(double)是两个不同的函数,尽管它们的函数名一样,但它们的签名不同,因此形成了函数重载,而不是函数重写。
柯本 2011-10-12
  • 打赏
  • 举报
回复
详细的

#include <stdio.h>

struct a{
void f(int c){printf("int");};
//void f(double c){printf("double");};
};
int main()
{
a a1;
a1.f(0); //调用int
a1.f(0.0); //隐式转换,可以调用int

}


#include <stdio.h>

struct a{
//void f(int c){printf("int");};
void f(double c){printf("double");};
};
int main()
{
a a1;
a1.f(0); //隐式转换,调用double
a1.f(0.0); //调用double

}

pathuang68 2011-10-12
  • 打赏
  • 举报
回复
C++里面struct和class没有什么不同,除了这一点:
缺省情况下,struct中成员是公有的,而class中的成员是私有的。
柯本 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lovesmiles 的回复:]
int 和double 不是可以默认转换的吗?
[/Quote]
可以,但如果你显式定义了二个函数,它会调用不同的
a a1;
a1.f(0); //调用int
a1.f(0.0); //调用double
如果你没定义其中一个,就会隐式转换
hondely 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lovesmiles 的回复:]

int 和double 不是可以默认转换的吗?
[/Quote]

这里又不是赋值,转换什么啊???你这个数据类型不同,可以重载的
勤奋的小游侠 2011-10-12
  • 打赏
  • 举报
回复
int 和double 不是可以默认转换的吗?
iamnobody 2011-10-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lovesmiles 的回复:]
那我想问一下
void f(int c){printf("int");};
void f(double c){printf("double");};
这两句没有错吗?他们可以重载吗?我一直以为他们不可以重载的
[/Quote]

可以,参数不同,编译器会自动匹配最佳的。
柯本 2011-10-12
  • 打赏
  • 举报
回复
c++的函数可以重载的,只要没二义性
函数后面带分号是没问题的,C/C++中分号可随意加的
勤奋的小游侠 2011-10-12
  • 打赏
  • 举报
回复
我估意加了
韦伊 2011-10-11
  • 打赏
  • 举报
回复
void f(int c){printf("int");};
奇了怪了,函数后面带分号?会不会是我看错了?
勤奋的小游侠 2011-10-11
  • 打赏
  • 举报
回复
那我想问一下
void f(int c){printf("int");};
void f(double c){printf("double");};
这两句没有错吗?他们可以重载吗?我一直以为他们不可以重载的
勤奋的小游侠 2011-10-11
  • 打赏
  • 举报
回复
我错了,原来是可以编译过的
jialejiahi 2011-10-11
  • 打赏
  • 举报
回复
表示编译没问题:

#include <iostream>

struct a{
void f(int c){printf("int");};
void f(double c){printf("double");};};

class b{
void f(int c){printf("int");};
void f(double c){printf("double");};};
int main ()
{
a testa;
b testb;
testa.f (3);
//下面这句编译不过,因为f默认是private的
//testb.f (4.24);
return 0;
}

编译环境cygwin gcc4.3.4
柯本 2011-10-11
  • 打赏
  • 举报
回复
编译没问题,你可能是以C方式编译的?
把文件名后缀改成.cpp试试
iamnobody 2011-10-11
  • 打赏
  • 举报
回复
没问题啊,你是不是在别的地方定义了一个class b;
【更新至2025年】2001-2025年上市公司数字化转型年报词频统计(吴非、赵宸宇、甄红线)(300+年报词频统计) 1、时间:2001-2025年 2、来源:上市公司年报 3、参考文献:企业数字化转型与资本市场表现——来自股票流动性的经验证据(吴非) 数字化转型如何影响企业全要素生产率(赵宸宇) 知识产权行政保护与企业数字化转型(甄红线) 4、方法说明:(1)参考吴非老师的做法,对人工智能技术、大数据技术、云计算技术、区块链技术、数字技术运用五个维度76个数字化相关词频进行统计 (2)参考赵宸宇老师的做法,对数字技术应用、互联网商业模式、智能制造、现代信息系统四个维度99个数字化相关词频进行统计 (3)参考甄红线老师的做法,对技术分类、组织赋能、数字化应用等类别下139个数字化相关词频进行统计 5、指标:年份、股票代码、公司简称、行业名称、行业代码、全文-文本总长度、仅中英文-文本总长度、人工智能技术-吴、大数据技术-吴、云计算技术-吴、区块链技术-吴、数字技术运用-吴、数字技术应用-赵、互联网商业模式-赵、智能制造-赵、现代信息系统-赵、技术分类-人工智能技术-甄、技术分类-区块链技术-甄、技术分类-云计算技术-甄、技术分类-大数据技术-甄、组织赋能-人工智能技术-甄、组织赋能-云计算技术-甄、组织赋能-大数据技术-甄、组织赋能-广义数字技术-甄、数字化应用-技术创新-甄、数字化应用-流程创新-甄、数字化应用-业务创新-甄、人工智能、商业智能、图像理解、投资决策辅助系统、智能数据分析、智能机器人、机器学习、深度学习、语义搜索、生物识别技术、人脸识别、语音识别、身份验证、自动驾驶、自然语言处理、大数据、数据挖掘、文本挖掘、数据可视化、异构数据、征信、增强现实、混合现实、虚拟现实、云计算、流计算、图计算、内存计算、多方安全计算、类脑计算、绿色计算、认知计算等300+词频

65,211

社区成员

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

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