gpt4 book ai didi

c# - 类实例是引用类型,结构是值类型 C#。它是否也适用于 C++

转载 作者:行者123 更新时间:2023-11-28 04:40:19 25 4
gpt4 key购买 nike

文章Passing a struct and passing a class to a method说类实例是引用类型,而结构是 C# 中的值类型,我尝试在 C++ 中复制相同的内容,以了解传入方法时结构和类实例的行为。

我发现在 C++ 中,您必须将类作为引用传递才能获得相同的结果,否则,它会将结构和类实例作为值传递。

#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
*/

我想了解更多关于结构和类实例的类型。请帮助我理解这一点。

最佳答案

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 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);

您正在调用“地址”运算符。这实际上是传递了 x 的内存地址。在功能上它与引用非常相似,但不是一回事。

关于c# - 类实例是引用类型,结构是值类型 C#。它是否也适用于 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50310003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com