当前位置:  开发笔记 > 编程语言 > 正文

C++中struct和class之间有什么区别?

如何解决《C++中struct和class之间有什么区别?》经验,为你挑选了8个好方法。

这个问题已在C#/ .Net的背景下提出.

现在我想学习C++中结构和类之间的区别.请讨论技术差异以及在OO设计中选择其中一个的原因.

我将从一个明显的区别开始:

如果您没有指定public:or private:,则结构的成员默认是公共的; 默认情况下,类的成员是私有的.

我确信在C++规范的模糊角落中还有其他差异.



1> Assaf Lavie..:

你忘记了类和结构之间棘手的第二个区别.

标准(C++ 98到C++ 11中的第11.2.2节):

在不存在的访问说明符 为基类,当派生的类声明,假定公共 结构,并且假定私人当类被声明.

为了完整起见,在(11.2)中定义了类和结构之间更广为人知的区别:

默认情况下,使用关键字class定义的类的成员私有的.默认情况下,使用关键字structunion定义的类的成员 是公共的.

附加差异:关键字class可用于声明模板参数,而struct关键字不能如此使用.


实际上,`struct`和`class`之间真正的_tricky_区别在于后者可以用来代替`typename`来声明模板参数,而前者则不能.`:)`
这不是第二个区别,只是问题不完整地说明了差异.默认情况下,使用`class`时,所有子对象都是私有的,默认情况下使用`struct`,并且都定义了类类型.
@MrUniverse:这是完全错误的.(有一所学校将其用于约定,但它没有语法强制执行.)
我想你错过了这一点,本.它是结构的公共继承和类的私有.这是一个非常重要的区别,与实际的成员访问完全无关.例如,语言很可能已经定义了它,例如,默认情况下两者都是公开继承的,你会得到非常不同的含义.
@MrUniverse:通过提及类型名,您已经造成了很大的困惑。class用作模板参数中的单词typename,在声明class或struct时,它与class的单​​词用法不同。模板,类和结构不能在您尝试过的同一上下文中提及。对于模板的含义,typename是更正确的词。棘手的是您尝试解释它的方式。
@sbi"结构和类之间真正棘手的区别" - 可爱,但问题是关于*a*struct和*a*class之间的区别,而不是关于可以使用关键字的区别.
@AssafLavie,这些真的是唯一的区别吗?如果没有标准的历史,我发现难以置信 - 为什么类和结构都包含在标准中,如果唯一的区别是语法糖?这个答案也缺乏"在OO设计中选择一个或另一个的原因",这个问题的一个重要部分.

2> Robᵩ..:

引用C++常见问题解答,

[7.8]关键字struct和class之间有什么区别?

结构的成员和基类默认是公共的,而在类中,它们默认为private.注意:您应该明确公开,私有或保护基类,而不是依赖于默认值.

结构和类在功能上是等同的.

好的,足够的那个干净的技术谈话.在情感上,大多数开发人员在类和结构之间做出了很强的区分.结构只是感觉像一堆开放的位,几乎没有封装或功能.课程感觉像是一个生活和负责任的社会成员,拥有智能服务,强大的封装屏障和明确的界面.既然这是大多数人已经拥有的内涵,那么你应该使用struct关键字,如果你有一个只有很少的方法并且有公共数据的类(这样的东西确实存在于设计良好的系统中!),否则你应该使用这个类关键词.



3> Jon Hanna..:

值得记住C++的起源和与C的兼容性.

C有结构,它没有封装的概念,所以一切都是公开的.

在采用面向对象的方法时,默认情况下公开通常被认为是一个坏主意,所以在制作一种本身有利于OOP的C形式(你可以在C中做OO,但它不会帮助你),这是在C++中的想法(最初是"C With Classes"),默认情况下将成员设为私有是有意义的.

另一方面,如果Stroustrup改变了语义struct,使其成员默认是私有的,那么它就会破坏兼容性(它不再像标准分歧那样经常出现,但所有有效的C程序都是有效的C++程序,这对于给予C++立足点有很大的影响.

因此,class引入一个新的关键字就像一个结构,但默认是私有的.

如果C++是从头开始的,没有历史记录,那么它可能只有一个这样的关键字.它也可能不会产生影响.

一般来说,人们在做C语言中如何使用结构时会倾向于使用struct; 公共成员,没有构造函数(只要它不在联合中,你可以在结构中使用构造函数,就像类,但人们倾向于不使用),没有虚拟方法等等.因为语言与通信一样多人们阅读代码以指示机器(或者我们坚持使用汇编和原始VM操作码),坚持使用它是个好主意.


我不同意“ C具有结构,它没有封装的概念,因此所有内容都是公共的。”,您可以在* .c`文件中隐藏“ struct”的定义,并让其他翻译单元仅将其与一个指针。因此,您具有更强大的封装,因为其他翻译单元甚至都不知道`struct`中的内容。

4> 小智..:

默认情况下,班级成员是私人的.Struct的成员默认是公开的.除此之外,没有其他差异.另见这个问题.


不仅是成员,还包括所有访问权限,包括继承权.
好吧,我会说另一个区别是语义.许多人的结构使他们认为"数据结构"是C的剩余部分.
@KrisKumler:那些不是"语义学"; 他们是个人感情.`struct`和`class`都声明了一个具有相同语义的_class_(尽管对定义体进行了解析方式的解释).

5> crashmstr..:

根据C++编程语言中的Stroustrup :

您使用哪种风格取决于环境和品味.我通常更喜欢使用struct公开所有数据的类.我认为这类"不太合适,只是数据结构".

在功能上,除了公共/私人之外没有其他区别


有什么区别?请解释.

6> 64BitBob..:

STRUCT是一种抽象数据类型,它根据结构规范划分给定的内存块.结构在文件序列化/反序列化中特别有用,因为结构通常可以逐字写入文件.(即获取指向结构的指针,使用SIZE宏计算要复制的字节数,然后将数据移入或移出结构.)

类是一种尝试确保信息隐藏的不同类型的抽象数据类型.在内部,可以有各种阴谋,方法,临时变量,状态变量.等等,它们都用于向希望使用该类的任何代码提供一致的API.

实际上,结构是关于数据的,类是关于代码的.

但是,您需要了解这些仅仅是抽象.完全可以创建看起来很像类和类看起来很像结构的结构.事实上,最早的C++编译器只是将C++代码转换为C的预编译器.因此,这些抽象是逻辑思维的一个好处,不一定是计算机本身的资产.

除了每种都是不同类型的抽象之外,Classes还为C代码命名难题提供了解决方案.由于您不能使用相同名称公开多个函数,因此开发人员习惯遵循_()模式.例如mathlibextreme_max().通过将API分组到类中,类似的函数(这里我们称之为"方法")可以组合在一起并保护其免受其他类中方法的命名.这允许程序员更好地组织他的代码并增加代码重用.从理论上讲,至少.


无法在C++中创建结构.只能使用继承的`struct`关键字创建一个类.

7> Suraj K Thom..:

1)默认情况下,类的成员是私有的,struct的成员是公共的.

例如,程序1在编译时失败,程序2工作正常.

// Program 1
#include 

class 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
#include 

class 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;
}



8> Skizz..:

唯一的另一个区别是类和结构的默认继承,毫不奇怪,它们分别是私有和公共的.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有