Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
VitPon
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 29
#1

Конструктор по умолчанию + объявление функции - C++

09.02.2013, 16:30. Просмотров 571. Ответов 8
Метки нет (Все метки)

Сам класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Man
{ public:
Man(int lName=30);
~Man();
bool CompareName(const char*) const;
int GetBirthYear() const
{
return birth_year;
}
...
Man::Man(int IName) 
{
cout « "Constructor is working" « endl;
pName = new char[lName + 1];
}
теперь собственно вопросы:
1) Разве является теперь данный конструктор конструктором по умолчанию? Ведь мы передаем туда один параметр и есть блок, в котором мы указываем ему, что делать. (Man(int lName=30))
2) Непонятно такие объявления ф-ций, чтобы в конце было const, зачем его надо писать? (int GetBirthYear() const)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2013, 16:30     Конструктор по умолчанию + объявление функции
Посмотрите здесь:

Конструктор и декструктор, явное и неявное объявление - C++
Конструктор и декструктор, явное и неявное объявление? Подскажите где об этом можно почитать?

Конструктор по умолчанию - C++
Доброе утро! При попытке доступа к данным-элементам объекта, созданного конструктором по умолчанию, программа загибается. Возникло...

Конструктор по умолчанию - C++
Здравствуйте, есть такой код: explicit RFileDownloader(QObject *parent = 0); explicit RFileDownloader(const QUrl &url = QUrl(),...

Конструктор по умолчанию - C++
У меня получается создавать конструктор по умолчанию если в хедере эти значения указаны: class Unit { protected: string name; ...

Конструктор по умолчанию - C++
Показывает ошибку : 1 IntelliSense: для класса "tovar" не существует конструктор по умолчанию Подскажите пожалуйста как сделать ...

Конструктор по умолчанию - C++
Я то ли динамику недопоняла, то ли классы, то ли конструктор... И теперь совсем запуталась. Что нужно написать в конструкторе без...

Конструктор по умолчанию - C++
как использовать конструктор по умолчанию в конструкторе с параметром? К по умолчанию заполняет массив заранее определёнными символами, а...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
09.02.2013, 16:38     Конструктор по умолчанию + объявление функции #2
1) да является, т.к. может быть вызван без аргументов, это единственное условие, чтобы называть какой-то конструктор конструктором по умолчанию, насколько мне известно
2) const после имени функции, перед телом, указывает на то, что метод не меняет состояние объекта класса и позволят использовать его для константных объектов класса
VitPon
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 29
09.02.2013, 16:46  [ТС]     Конструктор по умолчанию + объявление функции #3
Цитата Сообщение от abit Посмотреть сообщение
1) да является, т.к. может быть вызван без аргументов, это единственное условие, чтобы называть какой-то конструктор конструктором по умолчанию, насколько мне известно
2) const после имени функции, перед телом, указывает на то, что метод не меняет состояние объекта класса и позволят использовать его для константных объектов класса
1)немного не понял, как конструктор может быть вызван без аргумента, если аргумент дважды описан: в прототипе конструктора + вне класса, там где полный код конструктора.
2) если можно, напишите пример, где метод меняет состояние объекта класса.
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
09.02.2013, 16:55     Конструктор по умолчанию + объявление функции #4
Цитата Сообщение от VitPon Посмотреть сообщение
1)немного не понял, как конструктор может быть вызван без аргумента, если аргумент дважды описан: в прототипе конструктора + вне класса, там где полный код конструктора.
2) если можно, напишите пример, где метод меняет состояние объекта класса.
1) в вашем примере у единственного аргумента есть "=30", обратите внимание, это означает, что если вы явно не зададите аргумент, то по умолчанию он будет равен 30, т.е. будет возможно создание как
Man FirstMan(40)
также это эквивалентно Man SecondMan = 40;
но главное из-за =30 будет возможно создание
Man ThirdMan;
где как видите нет аргументов, и вызовется конструктор по умолчанию, который неявным образом туда засунет 30, т.е. аналогчино явному вызову ThirdMan(30);

2) ну для вашего примера я что-то не вижу ни одного состояния объекта, вы это дело опустили... но допустим если там в секции private есть скажем поле
unsigned int year_of_birth;
то сходу можно написать такой метод:
void Set_Year_of_birth (usigned int year) { this->year_of_birth = year}

как видите, при вызове ThirdMan.Set_Year_of_birth(1980); этот метод изменит состояние объекта и его нельзя сделать константным
VitPon
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 29
09.02.2013, 17:10  [ТС]     Конструктор по умолчанию + объявление функции #5
1) возник еще вопрос, почему допускается написания аргументов конструктора по разному, в классе
C++
1
Man(int lName=30);
вне класса
C++
1
Man::Man(int IName)
?
также это эквивалентно Man SecondMan = 40;
то есть это равносильно этому :
C++
1
Man SecondMan(40)
?
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
09.02.2013, 17:52     Конструктор по умолчанию + объявление функции #6
сия строчка в классе
C++
1
Man(int lName=30);
даёт вам право вызывать один и тот же констуктор как с аргументом lName так и вовсе без него, если вы его не укажите lName будет неявно присвоен 30,
при описании реализации же
C++
1
Man::Man(int lName)
это задавать не обязательно, компилятор из объявления конструктора поймёт, что если аргумент опущен, то вызывать Man::Man(30);

то есть это равносильно этому :
C++
1
Man SecondMan(40)
именно так... в Man SecondMan = 40 нет операции присвоения, здесь вызывается ТОЛЬКО конструктор инициализации, Man();
VitPon
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 29
09.02.2013, 18:08  [ТС]     Конструктор по умолчанию + объявление функции #7
зря только страницу обновил) если можете, верните пример назад, только с комментариями.
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
09.02.2013, 18:18     Конструктор по умолчанию + объявление функции #8
я отпечатал, потом подумал, что он для вас может оказаться сложным, поэтому постарался упростить сперва
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
36
37
38
39
40
41
#include <iostream>
 
using namespace std;
 
class A
{
public:
  A() { cout << "Constructor A\n"; }
  A(const A &) { cout << "Copy constructor A\n"; }
  A operator = (const A &) { cout << "Operator assign for A\n"; }
};
 
class B
{
public:
  A & getA() { return a; }
private:
  A a;
};
 
int main()
{
  B b;
  cout << "Mark 1\n";
  A & a1 = b.getA();
  
  cout << "Mark 2\n";
  A a2(a1);
  
  cout << "Mark 3\n";
  A a3 = a2;
  
  cout << "Mark 4\n";
  A a4;
  a4 = b.getA();
 
  cout << "address a1 = " << &a1 << endl;
  cout << "address a2 = " << &a2 << endl;
  cout << "address a3 = " << &a3 << endl;
  cout << "address a4 = " << &a4 << endl;
}
Добавлено через 5 минут
посмотрите какие конструкторы когда вызываются и обратите внимание что в Mark1 ничего не вызывается
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2013, 07:17     Конструктор по умолчанию + объявление функции
Еще ссылки по теме:

Конструктор по умолчанию - C++
Здраститя. #include &lt;iostream&gt; using namespace std; class random { public: random(int b){a=b;} ~random(){} int...

Конструктор по умолчанию - C++
Всем привет! Если в классе вообще нет конструктора, чем будут инициализироваться члены класса? И в чем отличие объект() и объект...

Не работает конструктор по умолчанию - C++
Нужно в конструкторе по умолчанию создать динамический массив и заполнить его элементами, но при компиляции выводится сообщение &quot;Не...

Конструктор с параметром по умолчанию - C++
Здравствуйте, знаю, что здесь про конструкторы много говорили, но я не смог решить свою проблему поэтому обращаюсь (хотя мне кажется что...

Конструктор копий по умолчанию. - C++
Почему, когда в vc++ vdfsadsad Добавлено через 46 секунд Почему если идёшь по коду с заходом в функцию не отображается вызов...


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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
14.02.2013, 07:17     Конструктор по умолчанию + объявление функции #9
Цитата Сообщение от VitPon Посмотреть сообщение
почему допускается написания аргументов конструктора по разному, в классе Man(int lName=30), вне класса Man::Man(int IName)?
Мало того, это требуется. Указывать значение параметра по умолчанию можно только в одном месте - либо в объявлении, либо в определении. И там, и там указывать нельзя, это вызовет ошибку при компиляции.
Yandex
Объявления
14.02.2013, 07:17     Конструктор по умолчанию + объявление функции
Ответ Создать тему
Опции темы

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