为什么我们在c++中需要“class”?

Why do we need `class` in C++?

本文关键字:class 我们 c++ 为什么      更新时间:2023-10-16

使用struct我们可以实现class的所有功能:

  • 构造函数、析构函数
  • 成员函数、静态函数
  • 重载函数、虚函数
  • 公共/私有/受保护的访问说明符。
  • 操作符

唯一的区别是默认的访问权限:class为private, struct为public。
那么为什么我们需要Class呢?

IIRC当c++被创建时(作为带有类的C语言),一个设计目标是只添加功能,所以最初的想法是在c++中有一个类,在C中有一个结构体。但后来事情变得模糊了,在接下来的20年里,结构体"变异"成某种类。

因为它显然更面向对象。

注意:这个答案是讽刺的,正如OP所指出的struct实现了class的所有功能,所以几乎没有附加值,它似乎更像是一个任意的设计选择。

您可能会认为,如果您采用一种约定,将class用于封装的OO类类型,将struct用于具有公共数据成员的非封装结构聚合类型,您将获得更可读的代码:这是编码标准通常要求的用法。

虽然struct可以表现得像一个类,但它并不强调该语言的面向对象性。所以我认为class被添加到语言中是为了强调c++的面向对象性。它还强调数据封装,因为类中的所有内容默认都是private,而struct不强调数据封装,因为结构体中的所有内容默认都是public

数据封装是面向对象编程的原则之一,所以我认为设置默认访问private是非常重要的。它从一开始就给人一种阶级设计的感觉。假设c++中没有关键字class,那么想象一下有多少人会创建像这样的主题:"为什么c++中的所有内容都默认是公共的,就像struct中的所有内容默认是公共的一样?"它是支持面向对象编程的语言的特征吗? 。对我来说,c++缺乏类设计的感觉。

这是一种更直观的语法。在基于类的OO语言中没有class似乎很奇怪。

我认为区别在于语义,还有一点语法。class强调这是一个类,而不是其他任何东西。从名字就能看出它的用法。在struct中,我们可以通过分组其他基本类型来构建一些东西,比如一个新的数据类型。但是分组数据类型并使用class创建一个新的数据类型是可能的,但是在这种情况下,名称class将会产生误导。

你是正确的。理想情况下,我们不需要class。它的引入是由于历史原因,c++的发明者想要区分struct作为普通的旧数据类型(C风格)构造和class作为既可以有函数又可以有构造函数的接口。(尽管struct仍然拥有class的所有权限)。

如果您从c++语言中删除class关键字,它仍然可以完美地工作(不是旧代码)。因为struct可以实现它的正常用法,template的相关含义可以通过typename实现。

对我来说,类和结构体的区别在于文档。

因此,从技术上讲,我们不需要它们(就像语言的许多特性一样),但是它们允许我们通过使用它们的方式向代码的用户传递额外的信息(只要你不滥用它们并遵循标准约定)。

下面是,它们是一样的。但我发现在不同的语境中,我用它们来识别不同的事物。因此,我能够通过声明类型的方式向类型的用户传递额外的信息。

如何使用:

  • 类通常推断出具有与之相关的动作的某种形式的对象。
    • 。你的标准OO对象概念。
  • 结构(通常)推断某种形式的属性包
    • 它可以有方法,但不一定是面向操作的。
  • 函数通常作为struct实现
    • 特别是当它们没有内部状态时。