我现在学习了几门 C++ 课程和一点 Python。不断出现的一个常见问题是我无法真正理解创建课程时发生的事情。我想知道是否有人可以解释 C++ 中的类的具体细节,或者至少将我指向非常详细的网站。我知道声明,但就访问器、方法、构造函数和析构函数的情况而言,即使您想定义何时以及为什么使用类的最佳时间。我只需要整体澄清。谢谢!
3 回答
在编程中,您拥有数据和操作该数据的函数。结构 ( struct
) 允许您将相关的数据片段分组到一个逻辑对象中。
类允许您将数据和函数组合为一个单元。因此,matrix_add(m1, m2)
您可以说,而不是说m1.add(m2)
。数据和函数可以是private
(仅类可访问)、protected
(类及其子类可访问)或public
(任何人都可访问)。这称为封装:通常,数据是私有的,可以通过一组公共函数访问。在 C++ 中,astruct
默认为公共范围,而a 默认为class
私有范围,但在其他方面是相同的。
访问器是通常提供对类的私有数据的访问的函数的名称。这些可以是返回(或获取)数据的getter ,也可以是修改(或设置)数据的setter 。通常,这些方法检查输入的有效性以确保内部约束成立。请注意,访问器可能不会直接返回私有数据,而是派生属性;也就是说,size
在empty
C++ 容器(向量、列表、...)上,可以将其视为访问器,即使这些可以是计算值。
构造函数是一个特殊的函数,它允许类将数据初始化为合理的值,或者允许用户使用可能不同的数据创建类的新对象。例如,一个矩形类可以由另一个矩形、一个点和大小、一组顶部/左侧/底部/右侧值构成,或者可以为空。在 C++ 中,构造函数与类同名;在 python 中,这被称为__init__
.
默认构造函数是一个不带参数并将类初始化为其默认状态的构造函数(例如,矩阵类的单位矩阵)。
复制构造函数是一个构造函数,它接受另一个类类型的对象并创建它的副本。这允许正确处理分配的内存(例如,对于字符串和向量类)。使用简单的数据结构,对象是按值复制的,因此两个对象将引用相同的内存。
析构函数是一个允许类执行清理的特殊函数。这可能是诸如删除任何分配的内存、释放互斥锁或关闭打开的文件句柄之类的事情。在 C++ 中,析构函数与类同名,但~
前面有一个,例如,对于一个matrix
类,析构函数是~matrix
.
方法只是作为类的一部分的函数。每个方法都将被操作的类对象作为第一个参数。声明方法时,C++ 在内部为您执行此操作(提供隐式this
参数),而 python 要求您显式提供参数。
在 C++ 中,运算符是一个特殊函数,用于实现例如+
、-
和。这允许您创建可以像内置类型一样使用的类(尤其是用于向量、矩阵、复数和有理数等数学类)。*
/
一个类(“派生”类)可以从另一个类(“基”类)继承。在这里,派生类是基类的子类,可以访问任何protected
数据或方法。这称为继承。这些构成了阶级层次。
可以构造一个类,使其具有virtual
可以被派生类覆盖的方法。这称为多态性。
您可以声明不提供任何实现的虚拟方法。这些方法称为纯虚方法,提供它们的类称为抽象基类。在这里,派生类需要实现这些方法,而对于非纯虚方法,派生类不需要实现这些方法。
只有纯虚方法(没有其他方法)的类实际上是一个接口类。C++ 对此没有任何特殊符号,而其他语言则有。
接口通常用于在两个或多个不同系统之间进行交互。例如,音乐播放器可以提供插件架构,允许插件扩展它可以处理的支持的音频格式。在这里,接口提供了播放器和插件之间的合同。
不断出现的一个常见问题是我无法真正理解创建课程时发生的事情。
我正在回答这部分,因为其他人已经回答了第二部分,但是下面的代码是 java,在查看代码时,请注意类概念而不是 Java 构造。
好吧,在进入编程世界的 CLASS 之前。让我们来看看一个真实的世界。如果我们环顾四周,我们会在我们的活回声系统中看到许多元素(岩石、动物、人类、植物等)。仔细观察发现,它们有一些共同的特征,可以归为一组[生命、器官、颜色等],我们将这种共同的分组称为“CLASS”的技术名称。
为了理解,编程世界中的类应该理解为什么会有这样一个叫做类的构造。主要事实是它是称为面向对象编程的编程范式的一部分,程序员试图将现实世界的对象(例如车辆、银行等)映射到称为对象的编程模型中。为了创建这些对象,我们必须创建一个可以实际描述这些对象的构造。这样的构造称为类。
为了完整性,下面的解释不仅仅是类。
让我们看一个技术示例 Circle、Rectangle、Square、Hexagon,观察它们我们发现它们属于一个常见的 CLASS,称为 SHAPE。
不要被下面示例中的细节 [extends、@Override 等] 冲昏了头脑。它解释了分类的简单概念,如何利用它来创建新的类。一旦创建了一个类,它就只是一个骨架,即它没有分配任何内存以供实际使用。为了使一个类有用,我们创建它的对象。所以对象是同一类具有不同状态的“元素”。
比如说圆形物体,obj1,obj2,每个物体都有不同的半径。
class Shape {
String name;
int color;
public Shape(String name, int color) {
this.name = name;
this.color = color;
}
String getName() {
return name;
}
int getColor() {
return color;
}
double getArea() {
return 0;
}
double getPerimeter() {
return 0;
}
}
class Rectangle extends Shape {
int l, b;
public Rectangle(int l, int b, int h, int color) {
super("Rectangle", color);
this.l = l;
this.b = b;
}
/* Overloading */
@Override
double getArea() {
return l*b;
}
/* Overloading */
@Override
double getPerimeter() {
return (2*l + 2*b);
}
}
class Circle extends Shape {
int r;
public Circle(int r, int color) {
super("Circle", color);
this.r = r;
}
dobule getArea() {
return (PI * (r*r));
}
double getPerimeter() {
return (2*PI*r);
}
}
将对象视为“智能”结构,它不仅包含数据,还包含操作该数据的代码。将类视为这些“智能”结构的类型定义。
创建类实例就像创建结构类型的变量一样。调用类的成员函数就像调用普通函数一样,将结构作为参数传递给它,名称为“this”。
当您理解了这一点时,您就已经对面向对象编程的全部内容了解最多了。
struct
顺便说一句:你知道关键字和class
C++ 中有什么区别吗?在结构中,默认情况下所有成员都是公共的,而在类中,默认情况下所有成员都是私有的。而已。否则结构和类是一回事。当您明确将所有成员声明为私有、公有或受保护时,您可以将它们切换出去,程序将像以前一样编译和工作。