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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2013, 15:58   #21
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

Я собствено не понял, т.к я не встричал раньше, что означает двоеточие , наподобие как тут
Код:
Cat(int initialAge = 5) : itsAge(initialAge) {};
ЯХотя приблизительно догадываюсь.

Блин, комплятор ругается. Я думал, что уж ,,все понял,, про классы, функции и обьекты.
Код:
int main()
 {
     Cat Frisky; 
     Frisky.Meow();
	Cat объект;
  //    Frisky.itsAge = 7; // переменная itsAge закрыта
	void Cat::Метод (int целая=100); //обычный метод
    {целая=целая+initialAge; cout << целая;cout << "  целая\n";}	
    cout << объект.GetAge();
	объект.Метод();
    return 0;
 }
cpp(87): error C2761: void Cat::Метод(void): повторное объявление функции не разрешается

Пи-си. Она у меня есть только в классе! Вот
Код:
void Метод ();

Последний раз редактировалось Stilet; 08.09.2013 в 17:21.
Dimka-novitsek вне форума Ответить с цитированием
Старый 08.09.2013, 16:10   #22
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Сообщение от Dimka-novitsek Посмотреть сообщение
Я собствено не понял, т.к я не встричал раньше, что означает двоеточие , наподобие как тут
Код:
Cat(int initialAge = 5) : itsAge(initialAge) {};
Ничего не означает. Просто запись такая. Так можно инициализировать закрытые переменные класса. Так часто поступают, поэтому нужно знать, а желательно использовать.

Цитата:
Сообщение от Dimka-novitsek Посмотреть сообщение
Код:
int main(int argc, char** argv) {

    //Cat c;
    //cout << c.GetAge() << endl;

    Cat Frisky;
    Frisky.Meow();
    Cat объект;
    //    Frisky.itsAge = 7; // переменная itsAge закрыта
    void Cat::Метод(int целая = 100); //обычный метод
    {
        целая = целая + initialAge;
        cout << целая;
        cout << "  целая\n";
    }
    cout << объект.GetAge();
    объект.Метод();
    return 0;
}
Вы русский что ли используете в программе?

Киньте нормальный код, который выдаёт ошибки. Весь.
8Observer8 вне форума Ответить с цитированием
Старый 08.09.2013, 16:22   #23
Dimka-novitsek
Форумчанин
 
Аватар для Dimka-novitsek
 
Регистрация: 22.04.2013
Сообщений: 592
По умолчанию

Простите, не надо весь Там сто строк разного путаного... Ерунды, в общем.

Русский я использую пока учусь, хотя знаю, что ,, так не принято ,, .
Dimka-novitsek вне форума Ответить с цитированием
Старый 08.09.2013, 17:08   #24
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Сообщение от Dimka-novitsek Посмотреть сообщение
Простите, не надо весь Там сто строк разного путаного... Ерунды, в общем.

Русский я использую пока учусь, хотя знаю, что ,, так не принято ,, .
Может проблема в том, что вы русский используете для названия объектов и методов? О_о Так делать нельзя, только английский. В комментариях можно.
8Observer8 вне форума Ответить с цитированием
Старый 08.09.2013, 19:28   #25
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Код:
Cat(int initialAge = 5) : itsAge(initialAge) {};
Это блок инициализации конструктора. Я уже где-то писал, что это такое.
Вобщем, блок инициализации конструктора позволяет выиграть в эффективности. Когда вы строите объект, сначла выделяется память, затем вызывается default конструктор и инициализирует начальными значениями данные-члены класса, далее вызывается ваша версия конструктора. Т.е вы ПЕРЕзаписываете (или переприсваиваете) значения данных-членов.
При использовании блока инициализации конструктора, Вы, тем самым, указываете компилятору, что нужно вызвать default конструктор и проинициализировать данные-члены теми значениями, которые Вы задали в в списке инициализации.

Насчет, повторного определения: компилятор такое не пропустит, как Вы уже поняли. Где-то Вы НЕСКОЛЬКО раз определили один и тот-же метод.
Когда компоновщик пытается связать объявление с определением он встречает такую вещь: дано несколько определений для этого объявления и он не понимает, какое определение нужно использовать. Есть правило одного определения, которое гласит, что для каждого объявленного идентификатора должно быть предоставлено только одно определение.
Код:
void Cat::Метод (int целая=100); //обычный метод
Вы в main объявляете метод... конечно же здесь ошибка. Метод внутри функции определить нельзя.
Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Может проблема в том, что вы русский используете для названия объектов и методов? О_о Так делать нельзя, только английский. В комментариях можно.
Visual Studio 2012 Ultimate пропустила русские символы.

Цитата:
Сообщение от Dimka-novitsek Посмотреть сообщение
Простите, не надо весь Там сто строк разного путаного... Ерунды, в общем.

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

Последний раз редактировалось Igor95; 08.09.2013 в 19:55.
Igor95 вне форума Ответить с цитированием
Старый 08.09.2013, 20:59   #26
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Небольшое уточнение.

Для встроенных типов, таких как int, double и т.д. нет разницы как написать, так:

Код:
    Cat(int initialAge = 5, int b = 8);
Код:
Cat::Cat(int initialAge, int b) {
    itsAge = initialAge;
    B = b;
}
Или же так:
Код:
    Cat(int initialAge = 5, int b = 8) : itsAge(initialAge), B(b) {};
А по поводу того, что:
Цитата:
Visual Studio 2012 Ultimate пропустила русские символы.
Это огорчает. Возможно скоро китайцы, индийцы и японцы будут на своих языках называть методы и переменные. Сначало в Visual Studio 2012 Ultimate, а потом и остальные подхватят
8Observer8 вне форума Ответить с цитированием
Старый 08.09.2013, 21:12   #27
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Небольшое уточнение.

Для встроенных типов, таких как int, double и т.д. нет разницы как написать, так:

Код:
    Cat(int initialAge = 5, int b = 8);
Код:
Cat::Cat(int initialAge, int b) {
    itsAge = initialAge;
    B = b;
}
Или же так:
Код:
    Cat(int initialAge = 5, int b = 8) : itsAge(initialAge), B(b) {};
А по поводу того, что:

Это огорчает. Возможно скоро китайцы, индийцы и японцы будут на своих языках называть методы и переменные. Сначало в Visual Studio 2012 Ultimate, а потом и остальные подхватят
Разница там есть.
Cat(int someVeriable = 5); - означает, что в случае если, при создании объекта, клиент умолчит насчет переменной someVariable, то будет использоваться значение по умолчанию - 5.
Блок инициализации конструкторов и значения, заданные по умолчанию - это две разные вещи, которые выполняют две разные задачи.
Igor95 вне форума Ответить с цитированием
Старый 08.09.2013, 21:25   #28
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Небольшое уточнение.

Для встроенных типов, таких как int, double и т.д. нет разницы как написать, так:

Код:
    Cat(int initialAge = 5, int b = 8);
Код:
Cat::Cat(int initialAge, int b) {
    itsAge = initialAge;
    B = b;
}
Или же так:
Код:
    Cat(int initialAge = 5, int b = 8) : itsAge(initialAge), B(b) {};
Во втором случае это эквивалент:

Код:
int itsAge;            //<--- ничего не делающий ctor
itsAge = initialAge; //<--- присвоение
В третьем случае и в первом случае эквивалент:
Код:
int itsAge = concrete_value;
_Bers вне форума Ответить с цитированием
Старый 08.09.2013, 21:40   #29
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Во втором случае это эквивалент:

Код:
int itsAge;            //<--- ничего не делающий ctor
itsAge = initialAge; //<--- присвоение
В третьем случае и в первом случае эквивалент:
Код:
int itsAge = concrete_value;
Это не три случая. А два.

Вот первый случай:

Код:
#include <iostream>
using namespace std;

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

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

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

int Cat::GetB() const {
    return B;
}

int main(int argc, char** argv) {
    Cat cat;
    cout << cat.GetAge() << endl;
    cout << cat.GetB() << endl;
    return 0;
}

Вот второй случай:

Код:
#include <iostream>
using namespace std;

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

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

int Cat::GetB() const {
    return B;
}

int main(int argc, char** argv) {
    Cat cat;
    cout << cat.GetAge() << endl;
    cout << cat.GetB() << endl;
    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 08.09.2013, 21:47   #30
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

А ну, мож невнимательно прочел.

Смысл простой: лучше инитить мемберы в списках, а туловище использовать только для окончательной настройки
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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