Должен ли я положить & при передаче структуры? - PullRequest
1 голос
/ 16 июля 2011

В приведенном ниже коде передается переменная структуры:

struct someStruct {
    unsigned int total;
};

int test(struct someStruct* state) {
    state->total = 4;
}

int main () {
    struct someStruct s;
    s.total = 5;
    test(&s);
    printf("\ns.total = %d\n", s.total);
}

(Источник от Передать структуру по ссылке в C )

Во время программирования на C ++ могупередать эту структуру без &?Я имею в виду

test(s); // or should test(&s);

Будет ли скопирована s, если я это сделаю?

Ответы [ 3 ]

3 голосов
/ 16 июля 2011

В C ++ вы можете заставить функцию принимать ссылку в качестве параметра:

int test(someStruct& state) {
    state.total = 4;
}

Вы можете вызвать функцию следующим образом:

someStruct s;
test(s);

Копирование не будет.Внутри функции state будет вести себя так же, как s.Обратите внимание, что ключевое слово struct требуется только при объявлении структуры в C ++.Кроме того, в C ++ ваш код для печати должен выглядеть следующим образом:

std::cout << "s.total = " << s.total << std::endl;

Вы должны включить iostream, чтобы это работало.

0 голосов
/ 16 июля 2011
test(&s);

pasess указатель на s.Вы бы использовали это в функции, которую вы в настоящее время определили, которая принимает указатель:

int test(struct someStruct* state) 

Если вы хотите передать по ссылке, вы измените определение функции на

int test(struct someStruct& state) 

и простопозвоните:

test(s)

и в тесте вы измените свой код на использование . вместо ->

0 голосов
/ 16 июля 2011

Вы должны передавать указатель или передавать по ссылке, если вы хотите изменить содержимое структуры, которую вы передаете функции, иначе функция изменит создаваемую локальную копию.

Вы можете передать указатель :

int test(struct someStruct* state);

или передать по ссылке

int test(struct someStruct &state);

В обоих случаях копия не будет создана, а исходная структура будет изменена.
Важно отметить, что передача по ссылке является более простым способом C ++.

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