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

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

Восстановить пароль Регистрация
 
VitPon
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 29
09.02.2013, 16:30     Конструктор по умолчанию + объявление функции #1
Сам класс:
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++ Конструктор по умолчанию
C++ Конструктор по умолчанию
C++ Конструктор по умолчанию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
 Аватар для 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
 Аватар для 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
 Аватар для 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
 Аватар для 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++
Конструктор и декструктор, явное и неявное объявление C++
C++ Конструктор по умолчанию

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

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

Текущее время: 23:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru