为什么我们在c++中需要“class”?
Why do we need `class` in C++?
使用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实现
- 特别是当它们没有内部状态时。
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 我们可以访问一个不存在的联盟的成员吗
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 我们可以删除链表中静态内存中的节点吗
- "Undefined class"作为is_base_of的论据
- 如何将class.cpp和class.hpp编译为一个.o文件
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 当我们为(;;) 写作时,它做了什么?for 循环中的双分号有什么作用?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 为什么我们需要 [basic.scope.class]/2?
- 我们什么时候应该封装代码才能成为"Class"?
- 我们如何在 c++ 中以朋友声明"friend elaborated-class-name ;"为例?
- 为什么我们在c++中需要“class”?