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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2013, 22:03   #31
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
А ну, мож невнимательно прочел.

Смысл простой: лучше инитить мемберы в списках, а туловище использовать только для окончательной настройки
В данном случае я не вижу разницы. А если у нас 20 мемберов типа int? Писать их через запятую в списке... я бы лучше в теле написал, в столбик. Так проще читать.
8Observer8 вне форума Ответить с цитированием
Старый 08.09.2013, 22:18   #32
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

К тому же, если будет много мемберов (встроенного типа), то в хэдере некрасиво будет смотреться список (+ значения по умолчанию). Я бы лучше убрал инициализацию в тело (в файл реализации). Ну 20 много, это я перегнул. Аргументы конструктора в числе 20 - это слишком. Пусть будет, скажем около 10, то в .cpp-файл их.
8Observer8 вне форума Ответить с цитированием
Старый 08.09.2013, 22:43   #33
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
А если у нас 20 мемберов типа int? Писать их через запятую в списке... я бы лучше в теле написал, в столбик. Так проще читать.
Во-первых, если в классе очень много мемберов, то это признак не очень качественного кода.

Во-вторых, в списках так же столбиком пишут:

Код:
Some::Some()
   :mValue(0)
   ,mError(false)
{}

И смотрится оно читабельно, ибо "канонично" (распространенная практика).

Ну а самое главное: чем больше интов, тем больше будет просадка производительности если не использовать список инициализации.

Поэтому, если интов будет много - то это как раз таки хорошая причина использовать именно список.

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
К тому же, если будет много мемберов (встроенного типа), то в хэдере некрасиво будет смотреться список
Списки инициализации относятся к реализации конструктора, а не к его декларации.

То бишь, их можно вынести в спп файл точно так же, как и туловище.
_Bers вне форума Ответить с цитированием
Старый 08.09.2013, 23:13   #34
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Во-первых, если в классе очень много мемберов, то это признак не очень качественного кода.
Ну это я перегнул с 20 мемберами, я потом поправился, что меньше 10.

Цитата:
Сообщение от _Bers Посмотреть сообщение
Во-вторых, в списках так же столбиком пишут:

Код:
Some::Some()
   :mValue(0)
   ,mError(false)
{}
И смотрится оно читабельно, ибо "канонично" (распространенная практика).
Да, читабельно, согласен. Но когда используешь автоматическое выравнивание. Ну то есть запускаешь программу для выравнивания текста (в NetBeans комбинация клавиш Alt+Shift+F), то список прижимается к левому краю. Возможно это можно настроить. А может и так читабельно будет. Просто привыкнуть нужно. Вот как прижимается:

Код:
Cat::Cat(int initialAge, int b)
: itsAge(initialAge),
B(b) {
}
Цитата:
Сообщение от _Bers Посмотреть сообщение
Ну а самое главное: чем больше интов, тем больше будет просадка производительности если не использовать список инициализации.

Поэтому, если интов будет много - то это как раз таки хорошая причина использовать именно список.
Вот здесь я пока не могу поверить на слово. Нужно поискать, почитать. Так как у Мейерса написано:

Цитата:
Для объектов встроенных типов вроде numTimesConsulted нет разницы по затратам между инициализацией и присваиванием, но для единообразия часто лучше инициировать все посредством списка инициализации членов.
Цитата:
Сообщение от _Bers Посмотреть сообщение
Списки инициализации относятся к реализации конструктора, а не к его декларации.

То бишь, их можно вынести в спп файл точно так же, как и туловище.
Да, спасибо! Я пример переделал:

Cat.h
Код:
#ifndef CAT_H
#define	CAT_H

class Cat {
public:
    Cat(int initialAge = 5, int b = 8);
    int GetAge() const;
    int GetB() const;
private:
    int itsAge;
    int B;
};

#endif	/* CAT_H */
Cat.cpp
Код:
#include "Cat.h"

Cat::Cat(int initialAge, int b) 
: itsAge(initialAge), 
B(b) {
}

int Cat::GetAge() const {
    return itsAge;
}

int Cat::GetB() const {
    return B;
}
main.cpp
Код:
#include <iostream>
#include "Cat.h"
using namespace std;

int main(int argc, char** argv) {
    Cat cat;
    cout << cat.GetAge() << endl;
    cout << cat.GetB() << endl;
    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 08.09.2013, 23:18   #35
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Даже вот так читабельнее будет, если запятаю перенести, как у тебя в примере (переменные на одном уровне теперь):

Код:
Cat::Cat(int initialAge, int b)
: itsAge(initialAge)
, B(b) {
}
8Observer8 вне форума Ответить с цитированием
Старый 09.09.2013, 01:51   #36
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

8Observer8,

"Для объектов встроенных типов вроде numTimesConsulted нет разницы по затратам между инициализацией и присваиванием, но для единообразия часто лучше инициировать все посредством списка инициализации членов"(c)Мейерс

А, ну я кажись понял:

Код:
int val;    //<--- выделение памяти и ничего не деланье
val = 10; //<--- присвоение примитиву равносильно тупо заполнить ячейку памяти
Код:
int val =10;    //<--- выделение памяти, и заполнение ячейки памяти
По смыслу, завтратам и наблюдаемому поведению для примитива оба варианта эквивалентны.

Действительно, второй вариант делает все ровно тоже самое, что и первый.

Моя ошибка была в том, что я почему то не подумал что: "ничего не делающий конструктор" - бесплатен. Потому что компилятор тупо ничего не делает.

/ps

На самом деле у примитивов вообще нет конструкторов. Да и сами эти примитивы - наследство языка си, где вообще нет конструкторов.
Но по правилам с++, все типы без исключений имеют конструкторы. И примитивы тоже. Так было сделано, что бы в шаблонах можно было единообразно обрабатывать любые типы: и примитивы и классы.

Поэтому, конструкторы примитивов - фиктивны. С точки зрения пользователя они как бы есть, но с точки зрения кухни компилятора - он имитирует их работу.

Это вызывает некоторую ассимитричность:

Для классов:

Код:
SomeClass obj; //<--- запуск дефолтного конструктора
const SomeClass& ref = SomeClass(); //<--- запуск дефолтного конструктора
В обоих случаях запускается один и тот же дефолтный конструктор.

Но у примитивов есть "как бы" два дефолтных конструктора:

1.
Код:
int val; //ничего не делающий конструктор. Будет содержать мусор
На самом деле здесь компилятор вообще никакого конструктора не запустит. Не зачем запускать заведомо пустую функцию.
Поэтому, он бесплатен.

Но я видимо так заморочился с шаблонами и унифицированными обработками, что привык думать что у любых типов всегда запускается ctor
И для облегчения понимания обозвал его "ничего не делающим" но все таки конструктором, а правильно думать "отсутствие конструктора"

2.

Код:
const int& ref = int(); //дефолтный конструктор, инициализует нулем

Последний раз редактировалось _Bers; 09.09.2013 в 02:03.
_Bers вне форума Ответить с цитированием
Старый 09.09.2013, 22:20   #37
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

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

А я все же, вернусь к коду

Код:
#include <string> 
#include <iostream> // для объекта cout
using namespace std;

#include<iomanip>
//Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это файл вместе с iostream, хуже не станет.
#include<fstream> 
//Подключается при работе с файлами.

   class Cat
		{
	 public:
	    Cat(int initialAge=5); 
	    ~Cat();
	    int GetAge() const; // метод доступа const функция доступа к данным-членам класса без права их изменения
	    void SetAge (int age);
	    void Meow();
		void Wydam()  {Bam();};	  //статический метод
		int Bgsamm();
	  private:
	    int itsAge;	// статические переменные класса (Статическое поле)
		int B;
		void Метод ();
	//	Cat(){itsAge=0; B=8;};
		void Bam( ){cout << "Wydam\n";
		                          int BG=itsAge+ B;
		                          cout << BG;   } 
	    
	    };
  										  
 // конструктор класса Cat
  Cat::Cat(int initialAge)
   {
   itsAge = initialAge;
   cout << "Cat constructor\n";
   }

  Cat::~Cat() // деструктор, который не выполняет никаких действий
  {
  cout << "Cat destructor\n";
  }

 

 int Cat::Bgsamm() 
 {
  return (itsAge++); 
 }


 

 // определение функции SetAge как открытого
 // метода доступа к данным класса
 void Cat::SetAge(int age)
 {
    // присваиваем переменной-члену itsAge
    // значение переданного парйметра age
  itsAge = age;
 }

 

      // Определение метода Meow
	  // возвращает void
	  // параметров нет
	  // используется для вывода на экран текста "Meow"
  void Cat::Meow()
  {
  cout << "Meow.\n";
  }

 

  Cat объект;
  void Cat::Метод (int целая=100); //обычный метод
 {целая=целая+initialAge; cout << целая;cout << "  целая\n";}	  

 int main()
 {
     Cat Frisky; 
     Frisky.Meow();
	
     cout << объект.GetAge();
	 объект.Bgsamm();
     объект.Wydam();
	 объект. Bam();
	 объект.Метод();
	 system("pause");
    return 0;
 }
cpp(76): error C2761: void Cat::Метод(void): повторное объявление функции не разрешается
Dimka-novitsek вне форума Ответить с цитированием
Старый 10.09.2013, 18:22   #39
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

*DELETED*
Прошу прощения - не посмотрел на сигнатуру Метод() и Метод(int).

Последний раз редактировалось Igor95; 10.09.2013 в 19:19.
Igor95 вне форума Ответить с цитированием
Старый 10.09.2013, 18:36   #40
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 588
По умолчанию

Ох, ты.
Я думал, что так надо. Спасибо!! Щас я еще на код посмотрю.
Dimka-novitsek вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу прощения. Но у меня опять проблема. Написал код но что то неправельно потправте меня. Sergey 23 Visual C++ 2 15.09.2012 19:59
CheckBox, что-то у меня не получается... Snekich Microsoft Office Excel 2 18.12.2011 20:12
Меня что, кто-то атакует? Altera Свободное общение 9 03.10.2010 18:34
Меня хакнули, что делать? Alex Cones Свободное общение 6 03.03.2010 23:14
что-то у меня не получается dinozavr Помощь студентам 10 22.04.2009 21:45