类的声明和定义

superqing 2010-02-07 11:14:02
一个.h文件里面有:
class A
{
....
};
这个语句到底是定义还是声明?
假设是定义,那么这个.h文件被n多c文件包含进去以后岂不发生重定义?实际上并没有。
假设是声明,那么为何那么多书都这样写:定义一个类:class A {...};?
...全文
1040 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
酒鬼 2012-09-07
  • 打赏
  • 举报
回复
第二个问题的几个回复感觉都不对。。
cuidragoncui 2012-06-28
  • 打赏
  • 举报
回复
Mark,顺便谢谢大伙
superqing 2010-02-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 traceless 的回复:]
联想呀 ~~ lz

类只不过是自个儿定义的“数据类型”。。。
[/Quote]

那么多人,就你一句话说中了关键!

类,其实是数据类型的定义,和struct、enum的定义没有区别,
1、类型定义和对象定义是有区别的:
类型定义的作用范围和enum的定义是一样,类似const对象的默认作用域,文件内部作用域,所以即使被多个.c文件包含进去也不会发生类类型重定义,除非被一个c文件多次展开,多次展开的情况才用#ifndef _H_ #define _H_头文件哨兵避免,
但是非const对象定义就不同了,默认是extern作用域,所以被多个c文件包含就会发生对象重定义,用不用头文件哨兵都一样,这一点都没有回答到。
2、class A
{
....
};
是类型定义,也同时进行了一个类型声明,所以在很多书上直接说声明一个类,稍微不严谨;
class A;才是单纯类型声明,声明只是说明一个名字在此处用到,所以可以重复声明。
cismylife 2010-02-07
  • 打赏
  • 举报
回复
jf
lovesi3344 2010-02-07
  • 打赏
  • 举报
回复
class A;
ostream& operator < <(ostream& o,A& a) ;
//前向声明

class A; 
ostream& operator < <(ostream& o,A& a) ;加上这两句就可以了
class A
{
public:
friend ostream& operator < <(ostream& o,A& a);
private:
int i;
};

ostream& operator < <(ostream& o,A& a)
{
a.i;
return o;
}
traceless 2010-02-07
  • 打赏
  • 举报
回复
联想呀 ~~ lz

类只不过是自个儿定义的“数据类型”。。。
xychzh 2010-02-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 superqing 的回复:]
一个.h文件里面有:
class A
{
  ....
};
这个语句到底是定义还是声明?
假设是定义,那么这个.h文件被n多c文件包含进去以后岂不发生重定义?实际上并没有。
假设是声明,那么为何那么多书都这样写:定义一个类:class A {...};?
[/Quote]

这是一种声明性的定义。因为声明和定义都不是绝对的,这点要知道。
你也可以看做他是一种特殊的声明。因为他还要写实现部分,不过也可以在类里写。

你不必担心在其他头文件里被重定义,因为,你不会使用相同的类名吧?
况且,一般的头文件,都要写:
#ifndef _XXXX_ // 随便填
#define _XXXX_

// 头文件内容。。。


#endif
以防止重定义。
s446721902 2010-02-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mstlq 的回复:]
C/C++ codeclass A;//前向声明class A
{
....
};//完整声明
A a;//这个才叫定义
[/Quote]
定义是否是指要分配内存?
camelisi 2010-02-07
  • 打赏
  • 举报
回复
up小乔
mstlq 2010-02-07
  • 打赏
  • 举报
回复

class A;//前向声明
class A
{
....
}; //完整声明

A a;//这个才叫定义
latofi 2010-02-07
  • 打赏
  • 举报
回复


#ifndef _H_
#define _H_
class A //这是声明啊。放在头文件里面。
{
private:
......
public:
......
};

stardust20 2010-02-07
  • 打赏
  • 举报
回复
class A
{
....
}; 定义
class A;这样才是声明
那么这个.h文件被n多c文件包含进去以后岂不发生重定义?
头文件不是会有一个

#ifndef
#define

//...
//...

#endif 就是为了防止重定义
ClassDan 2010-02-07
  • 打赏
  • 举报
回复
是定义,因为指定了类的数据成员和函数成员。类声明一般是指前向声明,如

class A;

64,642

社区成员

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

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