Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

09.02.2013, 16:30. Просмотров 653. Ответов 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)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2013, 16:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор по умолчанию + объявление функции (C++):

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? - C++
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

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

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

8
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 760
09.02.2013, 16:38 #2
1) да является, т.к. может быть вызван без аргументов, это единственное условие, чтобы называть какой-то конструктор конструктором по умолчанию, насколько мне известно
2) const после имени функции, перед телом, указывает на то, что метод не меняет состояние объекта класса и позволят использовать его для константных объектов класса
1
VitPon
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 29
09.02.2013, 16:46  [ТС] #3
Цитата Сообщение от abit Посмотреть сообщение
1) да является, т.к. может быть вызван без аргументов, это единственное условие, чтобы называть какой-то конструктор конструктором по умолчанию, насколько мне известно
2) const после имени функции, перед телом, указывает на то, что метод не меняет состояние объекта класса и позволят использовать его для константных объектов класса
1)немного не понял, как конструктор может быть вызван без аргумента, если аргумент дважды описан: в прототипе конструктора + вне класса, там где полный код конструктора.
2) если можно, напишите пример, где метод меняет состояние объекта класса.
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 760
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); этот метод изменит состояние объекта и его нельзя сделать константным
1
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)
?
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 760
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();
0
VitPon
0 / 0 / 0
Регистрация: 11.10.2011
Сообщений: 29
09.02.2013, 18:08  [ТС] #7
зря только страницу обновил) если можете, верните пример назад, только с комментариями.
0
abit
271 / 270 / 35
Регистрация: 03.02.2013
Сообщений: 760
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 ничего не вызывается
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
14.02.2013, 07:17 #9
Цитата Сообщение от VitPon Посмотреть сообщение
почему допускается написания аргументов конструктора по разному, в классе Man(int lName=30), вне класса Man::Man(int IName)?
Мало того, это требуется. Указывать значение параметра по умолчанию можно только в одном месте - либо в объявлении, либо в определении. И там, и там указывать нельзя, это вызовет ошибку при компиляции.
0
14.02.2013, 07:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2013, 07:17
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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