关于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还有什么区别?书上说的全是坑爹的。
...全文
172 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;

64,318

社区成员

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

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