这个问题已在C#/ .Net的背景下提出.
现在我想学习C++中结构和类之间的区别.请讨论技术差异以及在OO设计中选择其中一个的原因.
我将从一个明显的区别开始:
如果您没有指定public:
or private:
,则结构的成员默认是公共的; 默认情况下,类的成员是私有的.
我确信在C++规范的模糊角落中还有其他差异.
你忘记了类和结构之间棘手的第二个区别.
标准(C++ 98到C++ 11中的第11.2.2节):
在不存在的访问说明符 为基类,当派生的类声明,假定公共 结构,并且假定私人当类被声明类.
为了完整起见,在(11.2)中定义了类和结构之间更广为人知的区别:
默认情况下,使用关键字class定义的类的成员是私有的.默认情况下,使用关键字struct或union定义的类的成员 是公共的.
附加差异:关键字class
可用于声明模板参数,而struct
关键字不能如此使用.
引用C++常见问题解答,
[7.8]关键字struct和class之间有什么区别?
结构的成员和基类默认是公共的,而在类中,它们默认为private.注意:您应该明确公开,私有或保护基类,而不是依赖于默认值.
结构和类在功能上是等同的.
好的,足够的那个干净的技术谈话.在情感上,大多数开发人员在类和结构之间做出了很强的区分.结构只是感觉像一堆开放的位,几乎没有封装或功能.课程感觉像是一个生活和负责任的社会成员,拥有智能服务,强大的封装屏障和明确的界面.既然这是大多数人已经拥有的内涵,那么你应该使用struct关键字,如果你有一个只有很少的方法并且有公共数据的类(这样的东西确实存在于设计良好的系统中!),否则你应该使用这个类关键词.
值得记住C++的起源和与C的兼容性.
C有结构,它没有封装的概念,所以一切都是公开的.
在采用面向对象的方法时,默认情况下公开通常被认为是一个坏主意,所以在制作一种本身有利于OOP的C形式(你可以在C中做OO,但它不会帮助你),这是在C++中的想法(最初是"C With Classes"),默认情况下将成员设为私有是有意义的.
另一方面,如果Stroustrup改变了语义struct
,使其成员默认是私有的,那么它就会破坏兼容性(它不再像标准分歧那样经常出现,但所有有效的C程序都是有效的C++程序,这对于给予C++立足点有很大的影响.
因此,class
引入一个新的关键字就像一个结构,但默认是私有的.
如果C++是从头开始的,没有历史记录,那么它可能只有一个这样的关键字.它也可能不会产生影响.
一般来说,人们在做C语言中如何使用结构时会倾向于使用struct; 公共成员,没有构造函数(只要它不在联合中,你可以在结构中使用构造函数,就像类,但人们倾向于不使用),没有虚拟方法等等.因为语言与通信一样多人们阅读代码以指示机器(或者我们坚持使用汇编和原始VM操作码),坚持使用它是个好主意.
默认情况下,班级成员是私人的.Struct的成员默认是公开的.除此之外,没有其他差异.另见这个问题.
根据C++编程语言中的Stroustrup :
您使用哪种风格取决于环境和品味.我通常更喜欢使用
struct
公开所有数据的类.我认为这类"不太合适,只是数据结构".
在功能上,除了公共/私人之外没有其他区别
STRUCT是一种抽象数据类型,它根据结构规范划分给定的内存块.结构在文件序列化/反序列化中特别有用,因为结构通常可以逐字写入文件.(即获取指向结构的指针,使用SIZE宏计算要复制的字节数,然后将数据移入或移出结构.)
类是一种尝试确保信息隐藏的不同类型的抽象数据类型.在内部,可以有各种阴谋,方法,临时变量,状态变量.等等,它们都用于向希望使用该类的任何代码提供一致的API.
实际上,结构是关于数据的,类是关于代码的.
但是,您需要了解这些仅仅是抽象.完全可以创建看起来很像类和类看起来很像结构的结构.事实上,最早的C++编译器只是将C++代码转换为C的预编译器.因此,这些抽象是逻辑思维的一个好处,不一定是计算机本身的资产.
除了每种都是不同类型的抽象之外,Classes还为C代码命名难题提供了解决方案.由于您不能使用相同名称公开多个函数,因此开发人员习惯遵循_()模式.例如mathlibextreme_max().通过将API分组到类中,类似的函数(这里我们称之为"方法")可以组合在一起并保护其免受其他类中方法的命名.这允许程序员更好地组织他的代码并增加代码重用.从理论上讲,至少.
1)默认情况下,类的成员是私有的,struct的成员是公共的.
例如,程序1在编译时失败,程序2工作正常.
// Program 1 #includeclass Test { int x; // x is private }; int main() { Test t; t.x = 20; // compiler error because x is private getchar(); return 0; } Run on IDE // Program 2 #include struct Test { int x; // x is public }; int main() { Test t; t.x = 20; // works fine because x is public getchar(); return 0; }
2)从类/结构派生结构时,基类/结构的默认访问说明符是公共的.在派生类时,默认访问说明符是私有的.
例如,程序3在编译时失败,程序4工作正常.
// Program 3 #includeclass Base { public: int x; }; class Derived : Base { }; // is equilalent to class Derived : private Base {} int main() { Derived d; d.x = 20; // compiler error becuase inheritance is private getchar(); return 0; } Run on IDE // Program 4 #include class Base { public: int x; }; struct Derived : Base { }; // is equilalent to struct Derived : public Base {} int main() { Derived d; d.x = 20; // works fine becuase inheritance is public getchar(); return 0; }
唯一的另一个区别是类和结构的默认继承,毫不奇怪,它们分别是私有和公共的.