Экземпляр класса является ссылочным типом, а struct является типом значения C #.Это также применимо для C ++ - PullRequest
0 голосов
/ 12 мая 2018

Статья Передача структуры и передача класса методу говорит, что экземпляр класса является ссылочным типом, а структура является типом значения в C #, и я пытаюсь повторить то же самое в C ++, чтобы получитьзнать о поведении экземпляров struct и class при передаче в методе.

Что я выяснил, так это то, что в 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
*/

Я хочу узнать больше о Типе экземпляров структуры и класса.Пожалуйста, помогите мне понять это.

1 Ответ

0 голосов
/ 15 мая 2018

Существует только одно реальное различие между class и struct в C ++.В 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);

Вы вызываете оператор "address of".Фактически это передача адреса памяти x.Функционально это очень похоже на ссылку, но не то же самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...