类实例是引用类型,struct是值类型C#。它是否也适用于C ++

时间:2018-05-12 19:34:08

标签: c# c++ class struct

文章Passing a struct and passing a class to a method说一个类实例是一个引用类型,struct是C#中的一个值类型,我尝试在C ++中复制它,以便了解struct和class实例的行为。通过一种方法。

我想到的是,在C ++中你必须传递类作为引用来实现相同的结果,否则,它将把struct和class实例作为值传递。

#include <iostream>

using namespace std;

class TheClass
{   
    public:
        std::string willIChange;
};

struct TheStruct
{
    std::string willIChange;
};

void ClassTaker(TheClass *c)
{
    c -> willIChange = "Changed";
}

void StructTaker(TheStruct s)
{
    s.willIChange = "Changed";
}

int main()
{
    TheClass testClass;
    TheStruct testStruct;

    testClass.willIChange = "Not Changed";
    testStruct.willIChange = "Not Changed";

    ClassTaker(&testClass);
    StructTaker(testStruct);

    cout << "\n Class field = " << testClass.willIChange;
    cout << "\n Struct field = " << testStruct.willIChange;

    return 0;
}
/* Output:
Class field = Changed
Struct field = Not Changed
*/

我想了解更多有关struct和class实例的 Type 的信息。请帮助我理解这一点。

1 个答案:

答案 0 :(得分:1)

C ++中classstruct之间只有一个真正的区别。在class中,默认可见性为private,而在struct中,默认可见性为public。通常,C ++程序员使用这些来表达不同的东西。大多数情况下,如果你看到一个C ++程序员将某些内容写成struct,那么它将是一个愚蠢的对象,意味着直接访问它的字段。例如:

struct Point {
  int x = 0;
  int y = 0;
};
Point p;
p.x = 1;
p.y = 10;

当同一个程序员写class时,他们会尝试封装某些行为。

class Point {
  int x_ = 0;
  int y_ = 0;
 public:
  Point(int x, int y) : x_(x), y_(y) {}
  void Draw();
  void Translate(int x, int y);
}
Point p{10, 5};
p.Translate(1, -3);
p.Draw();

在为class交换struct并更新可见性时,可以实施上述两项操作。

作为您示例的随机说明......

F(SomeType* x) { x->SomeThing(); }

是指针传递,而不是引用传递。

F(SomeType& x) { x.SomeThing(); }

是一个参考传递(&)。

F(SomeType x) { x.SomeThing(); }

是按值传递,通常会创建一个写入的副本。

当您使用以下内容呼叫第一个时:

F(&x);

您正在调用&#34;地址&#34;运营商。实际上,这是传递x的内存地址。在功能上它与参考非常相似,但不是一回事。