Какой смысл установки по умолчанию функционирует в C++ 11?

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,client_id INT NOT NULL
,date INT NOT NULL
);

INSERT INTO my_table VALUES
(1,12,2008),
(2,15,2008),
(3,23,2008),
(4,12,2009),
(5,12,2009),
(6,18,2009),
(7,23,2010),
(8,18,2010),
(9,21,2010);

SELECT year
     , COUNT(*) total 
  FROM 
     ( SELECT client_id, MIN(date) year FROM my_table GROUP BY client_id ) x 
 GROUP 
    BY year;
+------+-------+
| year | total |
+------+-------+
| 2008 |     3 |
| 2009 |     1 |
| 2010 |     1 |
+------+-------+
19
задан Xeo 19 December 2011 в 02:12
поделиться

6 ответов

Конструктор по умолчанию будет иметь объявление, и это объявление будет подчиняться нормальным правилам доступа. Например, вы можете сделать конструктор копирования по умолчанию защищенным. Без этих новых объявлений сгенерированные по умолчанию члены являются открытыми.

19
ответ дан 30 November 2019 в 02:34
поделиться

Эти примеры с веб-сайта Страуструпа могут помочь вам понять суть:

функции по умолчанию и удаленные - управление значениями по умолчанию

Распространенная идиома «запрет» копирование "теперь можно выразить непосредственно:

 класс X {
 // ...

X & operator = (const X &) = удалить; // Запрещаем копирование
 X (const X &) = удалить;
};

Наоборот, мы можем также сказать явно что мы хотим по умолчанию копировать поведение:

 класс Y {
 // ...
Y & operator = (const Y &) = по умолчанию; // семантика копирования по умолчанию
 Y (const Y &) = по умолчанию;

};

Быть явным по умолчанию очевидно излишним, но комментарии к этот эффект и (что еще хуже) пользователь явное определение операций копирования предназначены для того, чтобы дать поведение по умолчанию не редкость. Оставляя это компилятор для реализации по умолчанию поведение проще, менее подвержено ошибкам, и часто приводит к лучшему объектному коду. Механизм «по умолчанию» может быть использован для любой функции, которая имеет значение по умолчанию. Механизм «удаления» можно использовать для любая функция. Например, мы можем устранить нежелательные преобразования, такие как это:

 struct Z {
 // ...

Z (длинный длинный); // можно инициализировать с помощью long long
Z (длинный) = удалить; // но не меньше
};
17
ответ дан 30 November 2019 в 02:34
поделиться

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

struct S
{
    virtual ~S();
    virtual S& operator=(const S&);
};

S::~S() = default;
S& S::operator=(const S&) = default;

Можно изменить следующие аспекты функций по умолчанию:

  • доступ (быть закрытым)
  • виртуальный
  • явный (конструкторы)
  • спецификации исключений
  • постоянство параметров

, но для этого функции должны быть определены вне класса (8.4 .2 / 2 в C ++ 0x Заключительном проекте комитета ).

Версией первоначального предложения Лоуренса Кроула является здесь .

Благодаря Роджера Пейта за разъяснения и цитаты.

12
ответ дан 30 November 2019 в 02:34
поделиться

1) Неявно генерируемые деструкторы в настоящее время не являются виртуальными. Поэтому вам нужно определить их, чтобы сделать их виртуальными, и в этом случае они не так эффективны. С = default, вы будете иметь как виртуальные, так и эффективные как неявно сгенерированные деструкторы.

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

3) Если вы встроите свой конструктор по умолчанию, ваш класс по-прежнему останется тривиальным

Вот статья, в которой описывается эта новая особенность.

2
ответ дан 30 November 2019 в 02:34
поделиться

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

1
ответ дан 30 November 2019 в 02:34
поделиться

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

0
ответ дан 30 November 2019 в 02:34
поделиться
Другие вопросы по тегам:

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