网上很多视频中的知识点都比较旧,很多东西也是自己后来多了解了点才恍然大悟。
虽然各种编程语言一直有在更新标准,例如C++的标准从98到11再到14。
虽然C++11已经被大部分编译器支持了,遗憾的是很多视频的授课内容依旧停留在98标准,甚至不少直接就用了“C语言式”的方法来传授C++的知识,实在有点囧。
————————————————————cut-off line——————————————————————————————
在C++中,struct其实和class一样,是一个定义类的关键字,C++中的struct和C语言中的struct是大不相同的。
在C++中,令我咋舌的是,struct和class唯一的区别就是默认访问权限不同!而远不止C语言的结构体概念,所以建议C++中不要引入“结构体变量”,都统称为“类”。
例如,下面的几个简单的代码所要表示的内容都是等价的:
1. struct 定义类,默认的访问权限是public
struct ClassName01 {
ClassName01() {}
~ClassName01() {}
int a;
double b;
};
2.
struct ClassName02 {
public:
ClassName01() {}
~ClassName01() {}
int a;
double b;
};
3. class 定义类,默认的访问权限的private
class ClassName03 {
public:
ClassName01() {}
~ClassName01() {}
int a;
double b;
};
有时候,我们也使用“C语言式”的语法来给一个struct 定义的类的变量赋值,并不意味着它们相似。
这是因为在C++中有一种聚合类(aggregate class)机制,提供了特殊的初始化语法形式。
——————————————————cut-off line——————————————————————————————
当一个类满足如下条件,就说它是聚合的:
1. 所有成员都是public的;
2. 没有定义任何构造函数;
3. 没有类内初始值;
4. 没有基类,也没有virtual函数;
可以提供一个花括号括起来的成员初始值列表,初始化聚合类的数据成员。
例如:
struct ClassA { //an aggregate class.
int id;
string name;
};
...
ClassA Sefa = { 1234, "Sefa" };
因此,在C++中见到的形如 ClassName obj = { 1, 2 }; 其含义跟C语言是大不相同的。
而虽然继承自C语言,也支持 struct ClassName obj; 这样定义一个变量,但在C++中,没有C语言的结构体,取而代之的是类,所以也建议不要写struct。
2016/11/01 补充
C语言中是结构体的声明是:
struct StructName { ... }
而C++中的类的定义是:
struct ClassName { ... };
C++中struct定义的类后面要跟上 ';' 就是类跟C语言中的结构体的根本性的不同。