目前对 c++ 中的 "working of classes" 非常困惑,任何人都可以通过示例提供直观的解释吗?
Currently very confused on the "working of classes" in c++, could anybody provide a intuitive explanation with examples?
我是编程新手,刚开始学习 c++ 的最低限度,有人可以提醒一下,并提供有关 c++ 中的 "working classes" 和方法的直观且易于理解的解释在程序中使用它们并将 "function" 合并到 类.
任何指向有用研究的链接 material 也很有帮助和赞赏。
在面向对象的编程语言中,class 是一个做某事的逻辑单元,class 也可以有应用程序域的名称。
例如,在数学图书馆中,您可以找到 Vector
或 Matrix
等 class,并且可以进行 dot
cross
等操作等等。这里有一个简单的、不起作用的片段:
class Vector3d {
public: // public interface
// constructor of the class: what happen when I create the class?
Vector3d() : _x{0.0}, _y{0.0}, _z{0.0} {}
// get components
double x() const { return _x; }
double y() const { return _y; }
double z() const { return _z; }
// set components
double x(doulbe newX) { _x = newX; }
double y(doulbe newY) { _y = newY; }
double z(doulbe newZ) { _z = newZ; }
// add an operation
Vector3d& operator+= (const Vector3d& vec)
{
x(vec.x());
y(vec.y());
z(vec.z());
return *this;
}
private: // hidden stuff
double _x, _y, _z;
};
如您所见,classes 公开了一个 public 接口,并隐藏了实现。写 classes 的主要优点是你可以使用你的领域问题的词,并有像这样的表达式:
Vector3d a{1.0, 0.0, 0.0}, b{0.0, 1.0, 0.0};
auto c = a + b;
auto d = cross(a, b);
不幸的是,设计好的 classes 并不容易,它需要大量的实践和经验......有很多准则需要牢记,所有编程语言都是如此。
在可能的情况下,我通常更喜欢自由函数而不是方法,所以对于我的 Vector3d
class 我将拥有像 operator+
dot
和 cross
这样的自由函数
Vector3d opertor+ (const Vector3d& v1, const Vector3d& v2)
{
return {v1.x() + v2.x(), v1.y() + v2.y(); v1.z() + v2.z();
}
一开始。我认为将 class 实例视为一组相关函数之间的一组共享参数是有帮助的:
所以,而不是:
fun1(a, b, c);
fun2(a, b, c, d);
fun3(a, b, c, e);
这样做:
class MyClass {
int a;
int b;
int c;
public:
MyClass(int a, int b, int c);
int fun1();
int fun2(int d);
int fun3(int e);
}
MyClass mc(a, b, c);
mc.fun1();
mc.fun2(d);
mc.fun3(e);
这样你可以传递更少的参数和更少的重复代码(即重复传递 a
、b
、c
到几个不同的函数,并确保它们在正确的顺序),这意味着更不容易出错的代码。
我是编程新手,刚开始学习 c++ 的最低限度,有人可以提醒一下,并提供有关 c++ 中的 "working classes" 和方法的直观且易于理解的解释在程序中使用它们并将 "function" 合并到 类.
任何指向有用研究的链接 material 也很有帮助和赞赏。
在面向对象的编程语言中,class 是一个做某事的逻辑单元,class 也可以有应用程序域的名称。
例如,在数学图书馆中,您可以找到 Vector
或 Matrix
等 class,并且可以进行 dot
cross
等操作等等。这里有一个简单的、不起作用的片段:
class Vector3d {
public: // public interface
// constructor of the class: what happen when I create the class?
Vector3d() : _x{0.0}, _y{0.0}, _z{0.0} {}
// get components
double x() const { return _x; }
double y() const { return _y; }
double z() const { return _z; }
// set components
double x(doulbe newX) { _x = newX; }
double y(doulbe newY) { _y = newY; }
double z(doulbe newZ) { _z = newZ; }
// add an operation
Vector3d& operator+= (const Vector3d& vec)
{
x(vec.x());
y(vec.y());
z(vec.z());
return *this;
}
private: // hidden stuff
double _x, _y, _z;
};
如您所见,classes 公开了一个 public 接口,并隐藏了实现。写 classes 的主要优点是你可以使用你的领域问题的词,并有像这样的表达式:
Vector3d a{1.0, 0.0, 0.0}, b{0.0, 1.0, 0.0};
auto c = a + b;
auto d = cross(a, b);
不幸的是,设计好的 classes 并不容易,它需要大量的实践和经验......有很多准则需要牢记,所有编程语言都是如此。
在可能的情况下,我通常更喜欢自由函数而不是方法,所以对于我的 Vector3d
class 我将拥有像 operator+
dot
和 cross
这样的自由函数
Vector3d opertor+ (const Vector3d& v1, const Vector3d& v2)
{
return {v1.x() + v2.x(), v1.y() + v2.y(); v1.z() + v2.z();
}
一开始。我认为将 class 实例视为一组相关函数之间的一组共享参数是有帮助的: 所以,而不是:
fun1(a, b, c);
fun2(a, b, c, d);
fun3(a, b, c, e);
这样做:
class MyClass {
int a;
int b;
int c;
public:
MyClass(int a, int b, int c);
int fun1();
int fun2(int d);
int fun3(int e);
}
MyClass mc(a, b, c);
mc.fun1();
mc.fun2(d);
mc.fun3(e);
这样你可以传递更少的参数和更少的重复代码(即重复传递 a
、b
、c
到几个不同的函数,并确保它们在正确的顺序),这意味着更不容易出错的代码。