c++,加class与不加有什么区别

yk__peng 2015-11-11 12:33:44
比如,声明式student s与class student s有什么区别。


我是发现如果我之前没有定义student的话,我写它的指针student *s时候,需要在前面家声明class student;如果我直接这样写class student *s,就可以免去先声明class student这句
...全文
503 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
C209 2015-11-13
  • 打赏
  • 举报
回复
使用时前面带上class的用法是从c继承过来的,c++里应该是和不带class的没有什么区别
CyberLogix 2015-11-13
  • 打赏
  • 举报
回复
纯C环境里,都要加struct,C++不需要
PonyCheng2019 2015-11-13
  • 打赏
  • 举报
回复
c++中struct和class基本是一个概念了,只不过struct 中默认都是public的,那么你会写class student *s么,看着多别扭啊。
醉江楼 2015-11-13
  • 打赏
  • 举报
回复
既然是声明,总得告诉编译器student是什么类型吧o(╯□╰)o 如果只有student *s,谁知道你这student是什么类型的。。。。。。
youthwong 2015-11-13
  • 打赏
  • 举报
回复
这两个我觉得是没有区别的。而且一般不建议把类的定义放在后面,另外我们一般是将类单独定义在.h文件中,这样在主程序中包含你总不能把包含的语句写在对象建立之后吧。
fefe82 2015-11-12
  • 打赏
  • 举报
回复
是。 C++11 3.4.4 Elaborated type specifiers If the elaborated-type-specifier has no nested-name-specifier, and unless the elaborated-type-specifier appears in a declaration with the following form: class-key attribute-specifier-seqopt identifier ; the identifier is looked up according to 3.4.1 but ignoring any non-type names that have been declared. If the elaborated-type-specifier is introduced by the enum keyword and this lookup does not find a previously declared type-name, the elaborated-type-specifier is ill-formed. If the elaborated-type-specifier is introduced by the class-key and this lookup does not find a previously declared type-name, or if the elaborated-type-specifier appears in a declaration with the form: class-key attribute-specifier-seqopt identifier ; the elaborated-type-specifier is a declaration that introduces the class-name as described in 3.3.2.
引用 13 楼 a627088424 的回复:
[quote=引用 12 楼 fefe82 的回复:] [quote=引用 11 楼 a627088424 的回复:] [quote=引用 9 楼 fefe82 的回复:] 1) class student *p; 会同时完成声明 class student; 的工作 2) class student 可以引用被隐藏的类名: class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 student t; // 错误,student 是一个变量 class student t; // OK }
class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 student t; // 错误,student 是一个变量 class student; student t; } 这样会怎么样[/quote] C++11 3.3.10 Name Hiding 2 A class name (9.1) or enumeration name (7.2) can be hidden by the name of a variable, data member, function, or enumerator declared in the same scope. If a class or enumeration name and a variable, data member, function, or enumerator are declared in the same scope (in any order) with the same name, the class or enumeration name is hidden wherever the variable, data member, function, or enumerator name is visible. class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 // student t; // 错误,student 是一个变量 class student; // 这是一个声明,声明了一个 func() 内部的 class student; ,不是全局的那个 student t; // 基于以上的 name hiding rule ,student 还是只能找到 int student ,于是错误。 /// 加一个: class student t; // 这里可以找到 func() 内部声明的 class student ,但这个 class student 是一个 incomplete type (没有定义),不能用于定义变量,于是错误。 }[/quote]class student *p; 会同时完成声明 class student; 的工作,是标准中的固有的语法特性吗[/quote]
  • 打赏
  • 举报
回复
创建类对象的时候 从来没加过……但是定义类的时候 是一定要加的
大大大白 2015-11-12
  • 打赏
  • 举报
回复
赵老师说的有道理,站在编译器的角度去理解看看
yk__peng 2015-11-12
  • 打赏
  • 举报
回复
引用 12 楼 fefe82 的回复:
[quote=引用 11 楼 a627088424 的回复:] [quote=引用 9 楼 fefe82 的回复:] 1) class student *p; 会同时完成声明 class student; 的工作 2) class student 可以引用被隐藏的类名: class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 student t; // 错误,student 是一个变量 class student t; // OK }
class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 student t; // 错误,student 是一个变量 class student; student t; } 这样会怎么样[/quote] C++11 3.3.10 Name Hiding 2 A class name (9.1) or enumeration name (7.2) can be hidden by the name of a variable, data member, function, or enumerator declared in the same scope. If a class or enumeration name and a variable, data member, function, or enumerator are declared in the same scope (in any order) with the same name, the class or enumeration name is hidden wherever the variable, data member, function, or enumerator name is visible. class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 // student t; // 错误,student 是一个变量 class student; // 这是一个声明,声明了一个 func() 内部的 class student; ,不是全局的那个 student t; // 基于以上的 name hiding rule ,student 还是只能找到 int student ,于是错误。 /// 加一个: class student t; // 这里可以找到 func() 内部声明的 class student ,但这个 class student 是一个 incomplete type (没有定义),不能用于定义变量,于是错误。 }[/quote]class student *p; 会同时完成声明 class student; 的工作,是标准中的固有的语法特性吗
fefe82 2015-11-11
  • 打赏
  • 举报
回复
引用 11 楼 a627088424 的回复:
[quote=引用 9 楼 fefe82 的回复:] 1) class student *p; 会同时完成声明 class student; 的工作 2) class student 可以引用被隐藏的类名: class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 student t; // 错误,student 是一个变量 class student t; // OK }
class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 student t; // 错误,student 是一个变量 class student; student t; } 这样会怎么样[/quote] C++11 3.3.10 Name Hiding 2 A class name (9.1) or enumeration name (7.2) can be hidden by the name of a variable, data member, function, or enumerator declared in the same scope. If a class or enumeration name and a variable, data member, function, or enumerator are declared in the same scope (in any order) with the same name, the class or enumeration name is hidden wherever the variable, data member, function, or enumerator name is visible. class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 // student t; // 错误,student 是一个变量 class student; // 这是一个声明,声明了一个 func() 内部的 class student; ,不是全局的那个 student t; // 基于以上的 name hiding rule ,student 还是只能找到 int student ,于是错误。 /// 加一个: class student t; // 这里可以找到 func() 内部声明的 class student ,但这个 class student 是一个 incomplete type (没有定义),不能用于定义变量,于是错误。 }
yk__peng 2015-11-11
  • 打赏
  • 举报
回复
引用 9 楼 fefe82 的回复:
1) class student *p; 会同时完成声明 class student; 的工作 2) class student 可以引用被隐藏的类名: class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 student t; // 错误,student 是一个变量 class student t; // OK }
class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 student t; // 错误,student 是一个变量 class student; student t; } 这样会怎么样
yk__peng 2015-11-11
  • 打赏
  • 举报
回复
class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 student t; // 错误,student 是一个变量 class student; student t; }[/quote] 这样会怎么样
fefe82 2015-11-11
  • 打赏
  • 举报
回复
1) class student *p; 会同时完成声明 class student; 的工作 2) class student 可以引用被隐藏的类名: class student { }; void func() { int student; // 定义变量,隐藏了全句的类名 student t; // 错误,student 是一个变量 class student t; // OK }
Saleayas 2015-11-11
  • 打赏
  • 举报
回复
如果你需要使用类的定义,那么必须要有这个类的完整的签名。class C{...}; 如果你仅仅使用类的指针定义,那么只需要这个类的前置签名。class C; 所以当你定义一个类指针的时候。 需要至少一个前置签名: class C; C *pC; 合并起来就是: class C *pC;
「已注销」 2015-11-11
  • 打赏
  • 举报
回复
区别也不大吧。
class student;
student *p;
和:
class student *p;
并没有任何区别,除非是 C 时代的匿名结构体:
struct { int dummy; } *p;
那你肯定是没法再次拿来声明。就不知道 C++ 是否有匿名类。
yk__peng 2015-11-11
  • 打赏
  • 举报
回复
或许我应该问,
class student;
student *p;
class student *p;
的区别
yk__peng 2015-11-11
  • 打赏
  • 举报
回复
引用 3 楼 SXJIAKE 的回复:
如果只是单纯的定义则需要先声明,或者使用声明 + 定义的方式。 C 语言: 声明: struct student1; struct student2 { int dummy; }; 定义: struct student1 s; struct student2 *ps; 声明 + 定义: struct student1 { int dummy; } s; struct student2 { int dummy; } *ps; C++ 语言: 声明: class student1; class student2 { int dummy; }; 定义 (C++ 可以省去 class): student1 s; student2 *ps; 声明 + 定义: class student1 { int dummy; } s; class student2 { int dummy; } *ps; C++ 的 struct 可使用 class 代替。
我是发现如果我之前没有定义student的话,我写它的指针student *s时候,需要在前面家声明class student;如果我直接这样写class student *s,就可以免去先声明class student这句
yk__peng 2015-11-11
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
定义类的时候都要加(可用struct代替):class student 定义类对象的时候,加和不加效果一样,我通常习惯不加
我知道 在纯C环境里,任何地方定义变变量时都要加struct,C++不需要
「已注销」 2015-11-11
  • 打赏
  • 举报
回复
如果只是单纯的定义则需要先声明,或者使用声明 + 定义的方式。 C 语言: 声明: struct student1; struct student2 { int dummy; }; 定义: struct student1 s; struct student2 *ps; 声明 + 定义: struct student1 { int dummy; } s; struct student2 { int dummy; } *ps; C++ 语言: 声明: class student1; class student2 { int dummy; }; 定义 (C++ 可以省去 class): student1 s; student2 *ps; 声明 + 定义: class student1 { int dummy; } s; class student2 { int dummy; } *ps; C++ 的 struct 可使用 class 代替。
paschen 版主 2015-11-11
  • 打赏
  • 举报
回复
定义类的时候都要加(可用struct代替):class student 定义类对象的时候,加和不加效果一样,我通常习惯不加
加载更多回复(1)

65,187

社区成员

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

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