абстрактный класс — Как понять предложение в учебнике по С ++, 3-й

Ниже приводится выдержка из главы 7.6 <C++ primer (3rd)> Стэнли Б. Липпман Жозе Ладжой.

Функция, указанная как inline, раскрывается «в линию» в каждой точке программы, в которой она вызывается. Например,

int minVal2 = min (i, j);

расширяется во время компиляции в

int minVal2 = i < J? я: J;

Таким образом, накладные расходы на выполнение функции min () удаляются.
min () объявляется встроенным путем указания ключевого слова inline перед возвращаемым типом функции в объявлении или определении функции:

встроенный int min (int v1, int v2) {/ * … * /}

Обратите внимание, что встроенная спецификация является лишь рекомендацией для компилятора. Компилятор может игнорировать это
рекомендация, потому что функция, объявленная inline, не является хорошим кандидатом для расширения в точке вызова. Рекурсивная функция,
например, rgcd (), например, не может быть полностью раскрыт в точке вызова (хотя его первый вызов может). 1200 строк
Функция также, вероятно, не будет расширена в точке вызова. В целом, встроенный механизм предназначен для оптимизации небольших прямых
линия, часто называемая функциями. Это имеет первостепенное значение для поддержки сокрытия информации при разработке абстрактных типов данных,
такой как класс IntArray, представленный в Разделе 2.3 со встроенной функцией-членом size ().

Может кто-нибудь объяснить, пожалуйста, предложение, выделенное жирным шрифтом?

1

Решение

У меня нет полного текста 3-го издания здесь, но из контекста, который вы опубликовали, ясно, что он говорит.

Представьте себе своего рода «векторный» класс.

class Vector {
private:
int * data; // pointer to data

Есть несколько способов обеспечить доступ к размеру вектора:

Выбор 1: общедоступная переменная-член:

public:
int datasize;

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

private:
int datasize;

public:
int getSize(); // body can be hidden in CPP, but would be { return datasize;};

Выбор 3: как 2, но с встроенным аксессором

private:
int datasize;

public:
inline int getSize() { return datasize; };

Теперь # 1 имеет слабое сокрытие данных, но отличную производительность. # 2 имеет сокрытие данных, но плохую производительность. № 3 имеет хорошее сокрытие данных и, возможно, отличную производительность. (запомните, это просто подсказка)

На мой взгляд, скрытие данных # 3 немного уступает # 2, потому что код функции отображается в заголовке — даже если вы не можете получить доступ к члену. Итак, я бы переписал его заявление в духе …

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

Я бы не согласился с тем, что это имеет «первостепенное значение», так как это всего лишь подсказка компилятору.

1

Другие решения

  • «В дизайне абстрактного типа данных он сыграл важную роль в
    поддержка скрытия информации «

Тип данных: Вы, наверное, знакомы с этим термином. Это может быть целое число, строка и т. Д. Или более сложный тип, например B-дерево, комплексное число и т. Д.

Абстрактный тип данных: Это типы данных, которые представляют некоторый реальный объект.

например

struct SCustomer
{
string name;
string address;
int    id;
enum CreditRanking { Good, Poor, Bankrupt };
CreditRating rating;
};

CreditRating абстрактный тип данных, как SCustomer.

Сокрытие информации: Инкапсулируя информацию внутри абстрактного типа данных, разработчик может думать об операциях, выполняемых с клиентом / с ним, без фактической реализации SCustomer, загромождающей их мыслительный процесс.

Информация на самом деле не скрыта, они могут заглянуть внутрь определения типа данных, если захотят, но во многих случаях проще просто сконцентрироваться на высоком (абстрактном) уровне и не думать о мелких деталях.

Вы можете думать об этом так:

  • Подумайте о деталях низкого уровня и постройте набор объектов.
  • Игнорируйте детали низкого уровня и объединяйте объекты в более крупные объекты или в приложение.

Вышесказанное немного упрощено, но я надеюсь, что это даст вам вкус.

Это помогает?

1

По поводу позднего появления «встроенных функций».

Вызов встроенной функции так же быстр, как ввод кода «в линию». Некоторые программисты могут колебаться, чтобы заключить свою логику в функции из-за накладных расходов по скорости и размеру, но использование встроенной функции минимизирует любые накладные расходы до (обычно) тривиальной величины.

Подумайте об этом коде:

int customer_code = get_code(customer_name);
int product_code  = get_id(product_name);
bool credit_ok    = check_credit(customer_code);
int order_number  = create_order(customer_code, credit_ok,
product_code, quantity);
print_order(order_number, customer_code, customer_name,
product_code, product_name, quantity);

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

order ord = cust.make_order(product, quantity);
order.print();

Это является частью гораздо более крупной программы, благодаря которой вы можете намного проще понять высокоуровневый код. Кому-то еще нужно спроектировать объекты «заказчик», «заказ», «продукт» и т. Д., Но им нужно сконцентрироваться только на одной вещи за один раз, и тогда объекты могут использоваться в программе.

0
По вопросам рекламы [email protected]