文章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 的信息。请帮助我理解这一点。
答案 0 :(得分:1)
C ++中class
和struct
之间只有一个真正的区别。在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
的内存地址。在功能上它与参考非常相似,但不是一回事。