Частный экземпляр конструктора с неименованным аргументом

Я читал некоторый код C ++ из базового эмулятора процессора, и я просто не могу понять это:

class CPU {
private:
CPU (const CPU&){}
};

Я понимаю указатели, я также проверил это: амперсант & с константой в конструкторе. По-видимому, это (жесткий) конструктор копирования, но я не понимаю, как это работает? почему конст? Почему в конце амперсанд без имени вар? Почему частный? Я не нашел такого примера в моих книгах или cplusplus.com.

На примечании стороны:

int foo(int var)  { cout << var; }
int bar(int &var) { cout << var; }

фу и бар печатать одно и тоже? полоса по сути печатная *&вар?

Любая помощь приветствуется!

2

Решение

& указывает передачу по ссылке при использовании в определениях аргументов. Это преобразует аргумент в указатель и отменяет ссылку на этот указатель, когда вы используете его в области действия функции. Во втором вопросе обе функции выводят одно и то же, потому что & просто говорит передать исходный объект по ссылке, а не копировать его в заголовок функции. Такой же контент существует, единственное отличие состоит в том, что одна из функций копирует полный ввод, а другая может редактировать исходную переменную, если это необходимо.

CPU (const CPU&){} говорит, что конструктор требует постоянной ссылки на объект процессора. Это означает, что вы можете получить доступ только к постоянным функциям ЦП (и гарантируете, что вы не измените исходный аргумент объекта ЦП). Не имея имени после CPU& просто означает, что вы не присваиваете переменную имени в текущей области видимости (так называемые скобки после определения будут игнорировать аргумент).

Когда конструктор является закрытым, это обычно означает, что есть другая функция, которая сгенерирует объект для вас. Фабрики часто прячут конструктор объектов и требуют некоторых других атрибутов / регистрации перед созданием объекта для вас.

1

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

Это не Работа. Рабочее слово здесь private, Эта целая конструкция создает конструктор копирования, который может быть вызван только из функции-члена, что фактически отключает это поведение. Обычно люди пропускают тело функции, чтобы вы могли получить ошибку ссылки, если бы вы вызывали ее из функции-члена.

На языке C ++ 11 это будет реализовано как

CPU(const CPU&) = delete;

Если вы действительно пытались вызвать это:

CPU x;
CPU y(x); // this is the one that matches the parameters

вы получите ошибку компилятора, потому что вы не член-функция, но пытаетесь вызвать частную функцию.

Они сделали это потому, что хотят запрещать функциональность — вы не можете создать один из этих объектов, используя конструктор копирования.

Константный процессор&»означает» взять ссылку на const CPU «. Оставлять имя переменной допустимым, потому что функция никогда не ссылается на него, но она должна соответствовать аргументу шаблон.

3

  1. const, потому что вы не изменяете объект, который копируете
  2. амперсанд означает эталон
  3. в объявлении метода не допускается имя аргумента, потому что важен только тип, а не имя

И, наконец, private — этот код просто «скрывает» конструктор копирования от других классов, что означает «не копируйте меня».

0

Это способ предотвратить случайное создание копии экземпляра вашего класса с помощью e.q. передавая его функции:

CPU foo;
void f1(CPU &foo) {}; f1(foo);  // work
void f2(CPU *foo) {}; f2(&foo); // work
void f3(CPU foo)  {}; f3(foo);  // fails

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector