Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2013, 17:16   #1
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Я бы хотел почитать более чотко выложеные правла создания конструктора.
Вроде, конструктор придставляет из сибя аналог функции и пишется так
Constrc(int A, double B) {A=55;B=445,78;}

Но я вижу примеры и без () после конструктора, и к угодно.

И вот, это пример с форума. Вот, вижу что вначале в конструкторе обнуляются переменные, а дальше его рассматривать как второй конструктор?
Или продолжение первого?А если второй-функция, то перед ней же нет ни воид, ни чего-то еще.

Код:
#include <iostream>
 
#include <string>
using std::string;
 
class chelovek
{
public:
string imya;
int vozrast;
int ves;
int rost;
string made_in;
/* данные класса специально открытые (public) что бы не писать 
функции get и set, что бы не тратить просто так время */
 
chelovek() { imya = "Unnammed"; vozrast = 0; ves = 0; rost = 0; made_in  = "Mars"; }
chelovek(string N, int VZ, int VS, int R, string M) 
{ imya = N; vozrast = VZ; ves = VS; rost = R; made_in  = M; }
};
 
int main()
{
chelovek first("Vasek", 20, 170, 120, "china" );
 
system("pause");
return 0;
}


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Stilet; 03.09.2013 в 17:37.
Dimka-novitsek вне форума Ответить с цитированием
Старый 03.09.2013, 18:00   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Конструкторов может быть сколько угодно.
У конструкторов нет типа результата, даже void.
Из конструкторов можно вызывать методы класса но нельзя вызвать другой конструктор.
waleri вне форума Ответить с цитированием
Старый 03.09.2013, 18:00   #3
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

Цитата:
а дальше его рассматривать как второй конструктор?
Это не второй конструктор, это перегруженные функции основного конструктора, который может быть только один. Если Вам удобнее для понимания, назовите её "дубликат" конструктора.
Перегруженных функций может быть сколько угодно, они отличаются входными параметрами.

Код:
class chelovek {
	public:
		// Этот конструктор будет инициализировать класс
		// которому не были переданы параметры
		chelovek() {
			imya = "Unnammed";
			vozrast = 0;
			ves = 0;
			rost = 0;
			made_in = "Mars";
		}

		// Этот конструктор будет инициализировать класс
		// которому параметры были переданы принудительно
		chelovek(string N, int VZ, int VS, int R, string M) {
			imya = N;
			vozrast = VZ;
			ves = VS;
			rost = R;
			made_in = M;
		}
};

// Пример в основном коде:
int main() {
	chelovek first; // Инициализация без входных параметров
	chelovek second("Vasek", 20, 170, 120, "china"); // Инициализация с принудительно заданными параметрами
	system("pause");
	return 0;
}


В данном случае целесообразнее было бы объявить один универсальный конструктор, который принимает параметры в любых случаях, указав значения этих параметров в объявлении конструктора.
Код:
class chelovek {
	public:
		chelovek(string N = "Unnammed", int VZ = 0, int VS = 0, int R = 0, string M = "Mars") {
			imya = N;
			vozrast = VZ;
			ves = VS;
			rost = R;
			made_in = M;
		}
};

// Инициализация класса не изменилась как с параметрами, так и без них:
int main() {
	chelovek first; // Инициализация без входных параметров
	chelovek second("Vasek", 20, 170, 120, "china"); // Инициализация с принудительно заданными параметрами
	system("pause");
	return 0;
}
Vladiger вне форума Ответить с цитированием
Старый 03.09.2013, 18:54   #4
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Конструкторы в C++ служат для созддания объекта, т.е выделения памяти для хранения его данных-членов.
Конструктор - это тоде метод, но! он не имеет типа возвращаемого результата. Если он - метод, то его можно и перегрузить. Отличие может выражаться в сигнатуре конструктора (т.е сигнатура конструктора - тип данных его формальных параметров).

Существуют, также, списки инициализации конструктора, которые позволяют задать значение данных-членов объекта. Отличие от обыкновенного вызова конструктора в том, что: вызывается стандартный конструктор и сразу же инициализирует данные-члены значениями, заданными в списке инициализации конструктора. Т.е повышается эффективность, без таких списков сначала данные члены были бы проинициализированы стандартным конструктором, а затем - вызывалась бы твоя версия конструктора и ПЕРЕзаписывала значения в ячейках памяти данных-членов объекта, что приводит к снижению эффективности.
Igor95 вне форума Ответить с цитированием
Старый 03.09.2013, 19:14   #5
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Спасибо!!!
Dimka-novitsek вне форума Ответить с цитированием
Старый 03.09.2013, 20:17   #6
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Я добавил в код функцию вывода, компилятор на ниё ругается, имено на строку, где я в функции обьявил вывод.Посмотрите пожалуста, вобще!

Код:
#include <iostream>
 
#include <string>
using std::string;
 
class chelovek
{
  public:
  string imya;
  int vozrast;
  int ves;
  int rost;
  string made_in;
  void QetAge();
  /* данные класса специально открытые (public) что бы не писать 
  функции get и set, что бы не тратить просто так время */
  chelovek() { imya = "Unnammed"; vozrast = 0; ves = 0; rost = 0; made_in  = "Mars"; }
  chelovek(string N, int VZ, int VS, int R, string M) 
  { imya = N; vozrast = VZ; ves = VS; rost = R; made_in  = M; }
};


void chelovek::QetAge()
 {
   cout << imya << "  "<< vozrast << "  "<< ves << "  "<< rost << "  "<<  made_in;
 }


int main()
{
 chelovek first("Vasek", 20, 170, 120, "china" );
 first.QetAge(); 
 system("pause");
return 0;
}
Dimka-novitsek вне форума Ответить с цитированием
Старый 03.09.2013, 21:05   #7
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

Цитата:
Я добавил в код функцию вывода, компилятор на ниё ругается, имено на строку, где я в функции обьявил вывод
Так вы читайте ошибки которые сообщает компилятор. В Вашем случае:
Цитата:
error C2065: cout: необъявленный идентификатор
Это означает, что идентификатора cout компилятор не нашел. Нужно писать в коде не cout, а std::cout, но Вы можете добавить имена окружений в начале кода.

После using std::string; добавьте строчку using namespace std; вот и вся проблема.
Vladiger вне форума Ответить с цитированием
Старый 03.09.2013, 21:35   #8
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Сообщение от Dimka-novitsek Посмотреть сообщение
Я добавил в код функцию вывода, компилятор на ниё ругается, имено на строку, где я в функции обьявил вывод.Посмотрите пожалуста, вобще!

Код:
#include <iostream>
 
#include <string>
using std::string;
 
class chelovek
{
  public:
  string imya;
  int vozrast;
  int ves;
  int rost;
  string made_in;
  void QetAge();
  /* данные класса специально открытые (public) что бы не писать 
  функции get и set, что бы не тратить просто так время */
  chelovek() { imya = "Unnammed"; vozrast = 0; ves = 0; rost = 0; made_in  = "Mars"; }
  chelovek(string N, int VZ, int VS, int R, string M) 
  { imya = N; vozrast = VZ; ves = VS; rost = R; made_in  = M; }
};


void chelovek::QetAge()
 {
   cout << imya << "  "<< vozrast << "  "<< ves << "  "<< rost << "  "<<  made_in;
 }


int main()
{
 chelovek first("Vasek", 20, 170, 120, "china" );
 first.QetAge(); 
 system("pause");
return 0;
}
У Вас нарушена инкапсуляция, что является мощнейшим инструментом ООП. Т.е у Вас видимы всему остальному коду свойства объекта, а если св-ва видны клиенту, то он может работать с ними и без интерфейса. Тогда нарушается и целостность абстракции и исчезает ее польза - уменьшение сложности.

cout - это объект, созданный для записи в него последовательности байтов для последующего вывода в стандартный поток. Он объявлен в пространстве имен - std. Пространство имен представляет собой набор идентификаторов, сгрупированных логически.

Для этого достаточно добавить директиву using namespace std;
Тогда можно убрать строку - using std::string (используются все идентификаторы string из пространства имен std).
Igor95 вне форума Ответить с цитированием
Старый 03.09.2013, 21:45   #9
Vladiger
Пользователь
 
Регистрация: 31.08.2013
Сообщений: 93
По умолчанию

Цитата:
Посмотрите пожалуста, вобще!
А если вообще, то даже не знаю что сказать. Ну вроде код как код.
Единственное о чём можно упомянуть, это сразу привыкать к хорошему тону програмиста, если конечно Вам это нужно.

Хорошим тоном считается не только знание языка, грамотное и эффективное использование функций и классов C++, но даже елементарное оформление кода. Просто задумайтесь об этом.

Начните хотя бы с форматирования кода отступами, которые гораздо заметнее табуляциями, чем пробелами. Пока Ваш код слишком маленький и маленькие отступы не сильно сбивают Вас с толку, но когда Ваш код разрастется и превратится в тысячи строк, Вы потом сами запутаетесь в блоках вашей программы.

И ещё имена переменных, об этом где то статью читал (сейчас уже не помню ссылку). Вроде бы в них нет ничего криминального, Вы програмист, Вам и придумывать эти имена, какие хотите. Но правилом хорошего тона, будет считаться то, что имена этих переменных будут понятны другим програмистам, которые будут читать ваш код... Более того, в именах переменных, не плохо бы ссылаться и на их тип, по этому поводу тоже есть некие правила. То есть если переменная строка, то в вашем случае гораздо "вежлевее" было именовать переменную imya как strName, а переменные intiger можно было именовать как nAge, а не vozrast. Да, да, именно по Английски, а не транслитом. Если хотите програмировать, привыкайте к Английскому языку, хотя бы с переводчиком...

Почему Вам не пришло в голову именовать переменные по Русски и Русскими буквами, ведь это не запрещено, более того это возможно. Компилятор запросто проглатывает Кирилицу, так что вся Ваша программа может выглядеть например так:

Код:
#include <string>
#include <iostream>

using std::string;
using namespace std;

class Человек {
	public:
		Человек(string параметрИмени = "Безымянный", int параметрВозраста = 0, int параметрВес = 0, int параметрРост = 0, string параметрМестоРождения = "Марс") {
			Имя = параметрИмени;
			Возраст = параметрВозраста;
			Вес = параметрВес;
			Рост = параметрРост;
			МестоРождения = параметрМестоРождения;
		}

		string Имя;
		int Возраст;
		int Вес;
		int Рост;
		string МестоРождения;
		void Вывод();
};


void Человек::Вывод() {
	cout << "Имя: " << Имя << "\nВозраст: " << Возраст << "\nВес: " << Вес << "\nРост: " << Рост << "\nМесто рождения: " << МестоРождения << "\n";
}


int main() {
	setlocale(LC_ALL, "Rus");
	Человек Первый("Васёк", 20, 170, 120, "Китай");
	Первый.Вывод();
	system("pause");
	return 0;
}
Правда красиво?
При том прошу заметить, код прекрасно компилируется и работает.
И тем не менее - это сарказм. Не делайте так никогда...

Это конечно мелочи, на работу они не влияют. Я повторюсь: - Это просто признаки хорошего тона, а уж следовать этому хорошему тону или нет, дело Ваше...
Vladiger вне форума Ответить с цитированием
Старый 03.09.2013, 22:02   #10
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

СПАСИБО!!!!!!!!!
Dimka-novitsek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновление поля формы после создания новой записи создания romanln2012 Microsoft Office Access 2 09.08.2012 14:12
Подскажыте програму для создания gif-анимаций, которые после создания не теряют четкости pufystyj Софт 1 24.02.2011 01:50
Автоматическое преобразование на основе первого аргумента конструктора в вызов самого конструктора jennya Visual C++ 8 03.10.2010 19:03
Создание конструктора Superlotles Общие вопросы C/C++ 5 23.05.2010 01:38
Правила разделов/главные правила Alex Cones О форуме и сайтах клуба 1 30.09.2009 17:49