Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
2 / 2 / 1
Регистрация: 30.07.2016
Сообщений: 118
1

Наследование и конструктор без параметров

22.11.2019, 16:06. Просмотров 372. Ответов 4
Метки нет (Все метки)

Здравствуйте, я нашел один листинг в книге Р. Лафоре. Не могу понять синтаксис конструктора.
C++
1
Counter () : count(0)
Зачем писать ": count(0)" и почему в скобках присваивание?

В чем отличие count(0) от count = 0?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
using namespace std;
 
class Counter                   //Базовый класс
{
protected:
    unsigned int count;         //Счетчик
public:
    Counter() : count(0) {              //Конструктор без аргументов
 
    }
    
    Counter(int c) : count(c){
 
    }
    
    unsigned int get_count() const{
        return count;           //Возвращает значение счетчика
    }
 
    Counter operator++()        //Увеличивает значение
    {
        return Counter(++count); //счетчик (префикс)
    }
    
};
 
class CountDn : public Counter //Производный класс
{
public:
    Counter operator--(){     //Уменьшает значение счетчика
        return Counter(--count);
    }
};


И как такое написать, например, если я буду использовать конструктор, который будет принимать
объекты (т.е. классы)

С либой SFML
C++
1
2
3
4
5
6
7
8
class Circle
{
protected:
    .......
public:
       Circle(sf::Vector2f position, sf::Vector2f velocity)
       .......
};
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2019, 16:06
Ответы с готовыми решениями:

Конструктор без параметров
class stack { private: int top; // вершина стека int s; // массив в котором хранится стек...

Не работает конструктор без параметров
1) Не работает конструктор без параметров. 2) Как должен выглядеть деструктор для классов Server и...

Как вызвать конструктор с параметрами в конструкторе без параметров?
Как вызвать конструктор с параметрами в конструкторе без параметров? То есть что бы конструктор с...

Конструктор без параметров: не выводится строка в приведенном коде
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &lt;iostream&gt; using namespace::std; class String...

4
21 / 13 / 8
Регистрация: 16.10.2019
Сообщений: 64
22.11.2019, 16:18 2
Цитата Сообщение от Goose45 Посмотреть сообщение
Зачем писать ": count(0)" ?
В чем отличие count(0) от count = 0?
В самой книге собственно и ответ, абзацем ниже:
"Причины, по которым инициализация не проводится в теле конструктора, достаточно сложны. Инициализация полей с помощью списка инициализации происходит до начала исполнения тела конструктора, что в некоторых
ситуациях бывает важно. Так, например, список инициализации — это единственный способ задать начальные значения констант и ссылок. В теле конструктора, как правило, производятся более сложные действия, чем обычная инициализация."

Цитата Сообщение от Goose45 Посмотреть сообщение
почему в скобках присваивание?
Тоже самое что и:
C++
1
2
Counter()
{ count = 0; }
0
Эксперт С++
8225 / 3813 / 826
Регистрация: 15.11.2014
Сообщений: 8,661
22.11.2019, 16:23 3
Цитата Сообщение от LizyH Посмотреть сообщение
Counter()
{ count = 0; }
это не тоже самое, что:
Цитата Сообщение от Goose45 Посмотреть сообщение
Counter() : count(0) {
не путай инициализацию и присвоение.
0
21 / 13 / 8
Регистрация: 16.10.2019
Сообщений: 64
22.11.2019, 17:23 4
Цитата Сообщение от hoggy Посмотреть сообщение
не путай инициализацию и присвоение.
В данном примере в обоих случаях это будет называться инициализацией, разве нет?
0
Эксперт С++
8225 / 3813 / 826
Регистрация: 15.11.2014
Сообщений: 8,661
22.11.2019, 17:51 5
Цитата Сообщение от LizyH Посмотреть сообщение
В данном примере в обоих случаях это будет называться инициализацией, разве нет?
конечно нет.

инициализация - установка первичных (стартовых) значений объекта.
присвоение - изменение состояния уже существующего объекта.

C++
1
2
3
4
5
6
7
Counter(): count(1)  // <--- инициализация. запуск конструктора с параметром (1) для объекта count
{ 
    // --- когда запускается тело конструктора
    // --- все его данные члены уже сконструированы
 
    count = 20; // < --- это присвоение 
}
если в списках инициализации конструктора не указанно,
чем именно нужно инициализировать мемберы,
тогда они всё равно будут сконструированы и проинициализированны конструктором по умолчанию

таким образом, запись вида:

C++
1
2
Counter()
{ count = 0; }
экививалентна:

C++
1
2
Counter(): count() // <--- инициализация без параметров
{ count = 0; }  // <--- присвоение

итого: 2 действия вместо одного.

вывод:
если нет каких то экзотических противопоказаний,
для инициализации предпочитай использовать список инициализации,
а не оператор=
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2019, 17:51

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

Контруктор шаблонного класса: почему в заданном коде необходим конструктор без параметров?
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;dcl.hpp&gt; #include &lt;string&gt; using namespace...

Наследование и конструктор.
Вот #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class String //базовый класс ...

Наследование и конструктор с параметрами
Добрый вечер! При разработке программы столкнулся с проблемой. По условию нужно использовать...

Наследование, перегрузка, конструктор
#include &lt;iostream&gt; class animal { public: animal() { } animal(int a) { age = a; }...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.