Кто такой конструктор копии в C++?

На странице 6 Эффективного C++ Scott Meyers определяется термин 'копия конструктора'. Я использовал книгу Schiltdt в качестве своей ссылки, и я не могу найти упоминание о конструкторах копии. Я получаю идею, но действительно ли это - стандартный компонент C++? Таких конструкторов вызовут когда передача класс значением?

7
задан John Feminella 30 January 2010 в 14:51
поделиться

4 ответа

Это никогда не будет очень быстро, так как у вас, вероятно, будет несколько промахов в кэше, вам придется либо перейти к одной матрице с большим шагом, либо к другой, не избежать этого. Проблема здесь в том, что компьютер любит, чтобы последовательные обращения к памяти были близки друг к другу, что в вашем алгоритме не является случаем индексации array_a пропусков по элементам высоты за один раз из-за члена высоты col . Чтобы исправить, что вы можете переключиться вокруг th для петель, но тогда у вас будет та же проблема с шириной (высота-1-ряд) член в array_b.

Вы можете переписать один из массивов в соответствии с порядком другого, но тогда у вас будет точно такая же проблема в коде, который переписывает, таким образом, это зависит от того, нужно ли вам делать такого рода вещи более одного раза на одних и тех же данных, если да, то имеет смысл сначала переписать одну из матриц, как Poita_ описано, иначе лучше оставить алгоритм как есть.

-121--3554039-

Я не знаю, как делать флэш-взаимодействия (и мне также интересно), но для html/javascript можно использовать Kickenfoot .

И чтобы получить безголовый + скриптовый браузер, работающий на Linux, вы можете использовать Qt webkit library . Вот пример использования .

-121--1117543-

Конструктор копирования имеет следующую форму:

class example 
{
    example(const example&) 
    {
        // this is the copy constructor
    }
}

В следующем примере показано, где он вызывается.

void foo(example x);

int main(void)
{
    example x1; //normal ctor
    example x2 = x1; // copy ctor
    example x3(x2); // copy ctor

    foo(x1); // calls the copy ctor to copy the argument for foo

}
11
ответ дан 6 December 2019 в 05:43
поделиться

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

Для явного ответа на вторую часть вашего вопроса: Да, когда вы передаете экземпляр объекта по значению, Copy Constructor будет использоваться для создания локального экземпляра объекта в объеме вызова функции. Каждый объект имеет «конструктор копирования по умолчанию» (GBAcon Aldudes к этому как «Compiler создал по умолчанию), который просто копирует каждый элемент объекта - это может быть не то, что вы хотите, например, если ваши объекты содержат указатели или ссылки, например.

Относительно хороших книг для (Re) обучения C ++ - я впервые узнал его почти два десятилетия назад, и с тех пор он изменил хорошую сделку, с тех пор - я рекомендую Брюсу Экель «Мышление в C ++» версиях 1 и 2, свободно доступным здесь (в Форма PDF, так и HTML):

http://www.ibiblio.org/pub/docs/books/eckel/

0
ответ дан 6 December 2019 в 05:43
поделиться

Да, Copy Constructors, безусловно, является неотъемлемой частью стандарта C ++. Узнайте больше о них (и других конструкторов) здесь (FAQ C ++).

Если у вас есть книга C ++, которая не учит о скопированных конструкторах, выбросить ее. Это плохая книга.

15
ответ дан 6 December 2019 в 05:43
поделиться

См. Copy Constructor на Википедии.

Основная идея - конструкторы копирования создают новые экземпляры, копируя существующие:

class Foo {
  public:
    Foo();                // default constructor
    Foo(const Foo& foo);  // copy constructor

  // ...
};

, учитывая экземпляр foo , вызывают конструктор копирования с помощью

Foo bar(foo);

или

Foo bar = foo;

Стандартные контейнеры библиотеки шаблонов требуют объектов Чтобы быть копироваемым и присвоенным, поэтому, если вы хотите использовать STD :: Vector , обязательно определите соответствующую конструктор копирования и Оператор = , если компилятор по умолчанию Не имею смысл.

4
ответ дан 6 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: