Я начинаю с C++
программирования и считаю, что у меня есть гр asp по поводу указателей. Однако я пытаюсь понять лучшие практики для указателей и функций при использовании распорок.
Пример кода игрушки
Ниже приведен пример кода Toy, чтобы проиллюстрировать два способа выполнения одной и той же вещи:
#include <stdio.h>
struct rectangle {
int width;
int length;
};
void printRect(rectangle rect) {
printf("Rectangle: width=%d, length=%d\n",rect.width, rect.length);
}
void doubleSizeRectangle_1(rectangle *rect) {
rect->width = rect->width*2;
rect->length = rect->length*2;
}
rectangle doubleSizeRectangle_2(rectangle rect) {
rectangle *r = ▭
r->width = r->width*2;
r->length = r->length*2;
return *r;
}
rectangle doubleSizeRectangle_3(rectangle rect) {
rect.width = rect.width*2;
rect.length = rect.length*2;
return rect;
}
int main()
{
rectangle rect;
rect.width = 2;
rect.length = 5;
rectangle *rect_pointer = new rectangle;
rect_pointer = ▭
printRect(rect);
printRect(*rect_pointer);
printf("Applying functions:\n");
doubleSizeRectangle_1(rect_pointer);
printRect(rect);
rect = doubleSizeRectangle_2(*rect_pointer);
printRect(rect);
rect = doubleSizeRectangle_3(*rect_pointer);
printRect(rect);
}
Этот код возвращает следующий вывод:
Rectangle: width=2, length=5
Rectangle: width=2, length=5
Applying functions:
Rectangle: width=4, length=10
Rectangle: width=8, length=20
Rectangle: width=16, length=40
Первые два отпечатка предназначены только для проверки использования указателей.
Остальные отпечатки предназначены для проверки трех функций doubleSizeRectangle_1
, doubleSizeRectangle_2
и doubleSizeRectangle_3
, которые выполняют одни и те же действия разными способами. Первый возвращает void
и использует указатель в качестве входных данных, тогда как второй и третий имеют переменную в качестве входных данных и возвращают прямоугольник struct
. Третий вариант кажется лучше второго, но хотел бы подтвердить. Я не уверен насчет первого по сравнению с остальными.
Вопрос
Какой вариант будет лучше с точки зрения наилучшей практики и почему? Есть ли какой-либо из этих вариантов лучше с точки зрения предотвращения утечек памяти? Могут ли быть другие способы использования указателей, и будут ли они даже лучше, чем те, которые я опубликовал?