powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Значения_по_умолчанию в методах класса, не врублюсь никак
14 сообщений из 14, страница 1 из 1
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32292471
Фотография Северный_Бобер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день Уважаемые! (Особенно vDimas).

продолжается моя битва с изучением с++ .
я читаю книгу Джесса Либерти (мож хто читал).
ДОбрался до использования значений, заданных по умолчанию в функциях-членах класса.
В обычных функциях я с этим разобрался.
Там например в прототипе функции аргументу присваивается значение и если ф-я будет вызвана без аргумента , то будет использовано значение по умолчанию (которое в прототипе стоит). С этим я понял. Но применительно к классам окончательно запутался.Может приведете малюсенький простой пример небольшого класса с демонстрацией этого момента.
Заранее спасибо.
Как дела у Димаса?
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32292659
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты имеещь ввиду Default ????
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32292748
Фотография Северный_Бобер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да дефолт.
вроде чо то прояснилось после книжки.
Либерти советует инициализировать значения переменных вне тела конструкторов.Согласны с этим, быки?

а как код в рамку взять?
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32292774
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да у классов помоему аналогично (аргументы заданные по умолчанию задаются только в конце списка аргументов).
Единственно имеются ньюанс у конструктора - списки инициализации членов.
А вот еще, когда разделяешь реализацию от объявления - зачения по умолчанию можно объявить только в одном месте.

Если где соврал не пинайте больно, я тоже начинающий.
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32292865
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
// .h
class test
{
public:
void test_f( int a =  10  );

};


// .cpp
#include <iostream>
#include  ".h" 

void test::test_f( int a )
{
          std::cout << a;
}

// main()

void main()
{
   test my_test;
   my_test.test_f( 100 );

   my_test.test_f();
   
}

...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32292930
Фотография Северный_Бобер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прочитал про перегрузку конструкторов и инициализацию объектов.Очень похоже на перегрузку функций. Компилятор сам выберет нужный конструктор из контекста.

//////////////////////////////////////////////////////////////////////////////////////////
спасибо funikovyuri за пример , просто супер!!!
допёр.

Чем больше я вникаю в с++ тем больше кажется что я нихрена не знаю в нем!
Это со мной такая зараза или ещо с кем то бывает?
что есть std ? может и в небо пальцем, но что то про простанство имен, да?
Вот тут еще вопросик созрел.

Читаю тут про конструктор-копировщик.
Как скопировать значение переменной одного объекта в переменную другого объекта (оба объекта одного класса)?
Я ешо не надоел? Говорите ели шо.
С форумом быстрей освоение идет, только чо то активность на сишном форуме ниже чем на басиковских или дельфинских. НЕужели мало сишников?
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32292987
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скопировать именно переменную объекта в другую переменную объекта (не важно одного ли класса обекты) можно
Код: plaintext
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.
class C1
{
private:
   int var1;
public
   int GetVar() { return( var1); }
}

class C2
{
private:
   int var2;
public
   void SetVar( int var ) { var2 = var; }
}

// main
void main()
{
C1 c1;
C2 c2;

c2.SetVar( c.GetVar() );

}

Т.е. конструктор копии тут не причем - он всегда инициализирует именно полную копию объекта. В вашем же случае важно как эти обекты друг друга видят (в моем примере они вообще друг о друге ничего не знаю) - в завичимости от этого примеры будут другими
Стоит посмотреть еще в сторону переменных класса (static)



насчет std - это действительно namespace в котором объявлена STL(standard template library)
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32293332
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так, много вопросов, все важные.

1. значения по-умолчанию.
вроде объяснили уже.
грабли:
сигнатура функции со значением по-умолчанию может совпадать с сигнатурой другой функции:
Код: plaintext
1.
2.
int f1(int i, int j= 10 );
int f1(int i);

объявление таких функций компилятор жует нормально, и ехидно ждет, когда же ты попытаешься использовать второй вариант перегруженной функции f1.
нет у тебя возможности ее использовать. :)

2. доступ к членам собственного класса
(копирование или другое использование переменных).
Для начала разберемся с this. Откуда он берется?
Дело в том, что не-статические методы классов всегда работают с некоторым экземпляром класса, т.е. с областью памяти, где храняться данные обрабатываемого экземпляра.
Код: plaintext
1.
2.
3.
4.
5.
class s1 {
  int m_k;

  int K() { return m_k; } // аналогично return this->m_k;
}

хоть функция и описана без параметров, на самом деле ей передается один параметр - указатель на экземпляр класса (область памяти), с которым эта функция будет работать.
Аналогично, если мы имеем один параметр, то для функции-метода класса передается два
Код: plaintext
1.
int F(int i) => int __thiscall F(s1* this, int i);

__thiscall - спецификатор способа вызова (calling convention), есть еще родственный спецификатор __fastcall (в VC++ по-умолчанию используется он), в этом случае указатель this передается не через стек, а через один из регистров (на Ix86 - CX/ECX).

Далее, рассмотрим пример использования 2-х и более параметров - указателей на собственный класс (в предыдущем и последующих примерах предполагаем, что все происходит в рамках определения класса s1):
Код: plaintext
1.
2.
3.
4.
5.
6.
ini M(s1* s) => int __fastcall M(s1* this, s1* s);

// тело ф-ии, копируем переменную
int s1::M(s1* s) {
  this->m_k=s->m_k;  // m_k=s->m_k;
}

прошу обратить внимание на:
- m_k - это private-член класса;
- this и s имеют одинаковые права для доступа к членам класса внутри метода этого класса.
- порядок разрешения имени, если явно не указан this:
1. локальная переменная или переменная-параметр (одно и то же),
2. член класса,
3. глобальная переменная в текущем namespace,
4. глобальная переменная в вышестоящем namespace
(безымянный namespace так и обозначается, как namespace без имени, например ::m_k=10; - явное указание на обращение к переменной m_k из глобального безымянного namespace)

3. модификатор const
не позволяет изменять не mutable члены класса.
Код: plaintext
1.
2.
3.
4.
5.
6.
int Sum(const s1* s) const;  => int __fastcall Sum(const s1* this,  const s1* s);

//тело
int s1::Sum(const s1* s) {
  return m_k+s->m_k;
}

4. Конструктор копирования
всегда есть! - это большое достижение С++ по сравнению с C. :)
вот его сигнатура
Код: plaintext
1.
s1(const s1& src);

Если ты его не определил, но копируешь значения типа s1, то компилятор его создаст за тебя, причем в теле этого конструктора он будет просто последовательно вызывать конструкторы копирования всех членов твоего класса. (!!!)

грабли:
- ты все же определил конструктор копирования, но теперь у тебя нет конструктора по-умолчанию, т.е. конструктора без параметров!!! Конструктор по-умолчанию компилятор генерит за тебя, если ты не определил ни одного конструктора для данного класса.
- ты написал шаблонный конструктор (может еще не дошел до этой темы, но дойдешь - вернись), причем, согласно правил подстановки шаблонов он может "покрыть" конструктор копирования. Фиг! именно этот случай не покрывается шаблонным конструктором, конструктор копирования или задаешь в явном виде, или компилятор генерит его сам .

----
заранее извиняюсь, если где пропускал точки с запятой и проч.
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32293562
Фотография Северный_Бобер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vdimas
Пришел на работу.
Спасибо, перевариваю твою минилекцию...Скоро будут вопросы.
(тренируюсь на консольном виде приложений VC++)
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32293579
Фотография Северный_Бобер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Димасу или Юре

спецификатор this показывает что это принадлежит тому классу где он объявлен? Ну т.е если this торчит в методе класса, то значит указывать будет на переменную этого же класса? Я правильно понял или нет?

[r.h]
class Kisa
{
private :
int age;

public:
Kisa() {age=2;}//

~Kisa(){}; //

int GetAge()const {return this->age;}

void SetAge(int newValue) {this->age=newValue;}


};//конец класса

#include <iostream.h>
#include "r.h"

void main()
{Kisa rjj;
cout<<"Vozrast is Cat = "<<rjj.GetAge()<<endl;
rjj.SetAge(10);
cout<<"Vozrast is Cat = "<<rjj.GetAge()<<endl;
}

результаты
Vozrast is Cat = 2
Vozrast is Cat = 10
Press any key to continue

с помощью this можно обращаться только к классу Kisa . так.


про использование const

const int f(int h);

int f(int h) const ;

const int f(int h) const;

как будет правильно сказать про эти функции в контексте использования const


так как код в рамку брать?
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32294213
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет this
this – это указатель на себя, т.е. на объект в методе которого он используется
В Pascal – это self.
int GetAge()const {return this->age;} // написать так можно, но компилятор и так бы понял что речь идет о переменной объекта. this иcпользуется, например, в ситуациях когда объекту необходимо както сообщить о себе другому объекту и т.д.
Например
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	
Пусть timer – это глобальный объект
	
	void timer_user::register( void )
	{
		timer->Register( this );
             }


про использование const

const int f(int h); // Сообщает компилятору что f() возвращает константу. В данном случае бессмыслено – так как возвращается не ссылка, а значение
вот если бы вы написали
const int &f(int h);
то в дальнейшем, при попытке написать код


f(10) = 5;

Компилятор сообщил бы что невозможно изменять константный объект (ссылку на число возвращенное функцией)


int SomeClass::f(int h) const ; // Такое объявление говорит компилятору что функция не меняет внутренне состояние объекта – т.е. она может быть записана как int f(const SomeClass *this, int h);

const int f(int h) const; // теперь должно быть ясно что первый const – это сообщение о том что возвращается константа, а второй – что функция не изменяет состояние объекта
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32294728
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ничего мне не осталось пока добавить, кроме этого:
Код: plaintext
1.
так как код в рамку брать?


выделяй код, дави на |SRC|-кнопку.
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32294808
Фотография Северный_Бобер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо!
...
Рейтинг: 0 / 0
Значения_по_умолчанию в методах класса, не врублюсь никак
    #32294910
Fib
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Fib
Гость
Про список инициализации членов класса.
здесь тонкости..например как ты инициализируешь константный член класса?
к тому же есть тонкости, ..как ты думаешь, почему список инициализации лучше (поставь точки прерывания везде и поглдяи на 2 случая)
#include <iostream.h>

class some2
{
int m_i;
public:
some2(int i = 0) : m_i(i){
}
some2(const some2& obj){
m_i = obj.m_i;
}
void operator= (const some2 &a){
m_i = a.m_i;
}
};
1 случай:
class some
{
some2 m_some2;
public:
some(some2& obj) {
m_some2 = obj;
}
};
2 случай:
class some
{
some2 m_some2;
public:
some(some2& obj) : m_some2(obj){}
};


void main()
{
some2 s2(8);
some s(s2);
}
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Значения_по_умолчанию в методах класса, не врублюсь никак
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]