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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2015, 14:53   #1
robix
Пользователь
 
Регистрация: 16.07.2015
Сообщений: 31
По умолчанию Вызов функции класса без объекта

Здравствуйте!

Допустим есть класс EDU и внутри него есть функция Work(....)
Она объявлена как static и определена с ключевым словом inline
Сам класс и функция Work объявлены и описаны в HDR.H
Допустим в SRC.CPP я вызываю функцию EDU::Work (...) без создания экземпляра класса.

И возникают такие вопросы:

1. Можно ли было вызывать эту функцию если она не была бы static?
2. Что дает слово inline в описании функции в HDR.H ?
3. Получается, что вызвав эту функцию Work автоматически вызывается конструктор класса, где я могу инициализировать его переменные, которые использую в функции Work хотя экземпляр класса EDU при этом не создается, так получается?
robix вне форума Ответить с цитированием
Старый 16.07.2015, 15:03   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Можно ли было вызывать эту функцию если она не была бы static?
Я бы на это не надеялся...
На то он и статик.
Цитата:
Что дает слово inline
http://programmersclub.ru/35/
Цитата:
Получается, что
Почему? Конструктор запускается, когда классу отводится память. Если ты вызываешь статический метод, то сомневаюсь что конструктор отработает. По крайней мере это нонсенс.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2015, 15:55   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
1. Можно ли было вызывать эту функцию если она не была бы static?
Вызывать когда и как? Просто так без создания объекта - нет. Как функцию объекта вполне.

Цитата:
3. Получается, что вызвав эту функцию Work автоматически вызывается конструктор класса
Нет, не вызывается. На то она и функция без объекта.

Цитата:
где я могу инициализировать его переменные, которые использую в функции Work хотя экземпляр класса EDU при этом не создается
Нет, не можете, если они не статические. Кто под них память выделит и прочее?
p51x вне форума Ответить с цитированием
Старый 16.07.2015, 16:03   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как функцию объекта вполне.
Всмысле как функцию класса? Объект-то не создан жеж.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2015, 17:27   #5
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Статик функция отличается тем, что в нее не поступает указатель на объект класса, т.е. this.
Цитата:
Сообщение от Stilet Посмотреть сообщение
Всмысле как функцию класса? Объект-то не создан жеж.
Код:
class TempClass{
    int a;
public:
    TempClass():a(10){}
    int Get10(){
        return this->a;   //  this, о котором я говорил
    }
    static int Get20(){
        return 20;
    }
};
Код:
    cout << TempClass::Get10();  //  будет ошибка, что нельзя вызывать без объекта класса

    cout << TempClass::Get20();  //  можно вызывать без объекта класса
Но статик функции можно вызывать и с объектов класса:
Код:
    TempClass tempClass;
    cout << tempClass.Get20();  //  можно вызывать и с объектом класса, но разницы не будет никакой
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 16.07.2015 в 17:31.
Krasiosoft вне форума Ответить с цитированием
Старый 16.07.2015, 17:33   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

robix

1. Можно ли было вызывать эту функцию если она не была бы static?

если очень хочется, то вызвать можно.
((EDU*)0)->Work();
на этом программа всё Ж)


2. Что дает слово inline в описании функции в HDR.H ?

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


3. Получается, что вызвав эту функцию Work автоматически вызывается конструктор класса, где я могу инициализировать его переменные, которые использую в функции Work хотя экземпляр класса EDU при этом не создается, так получается?

ничего ты с переменными сделать не можешь.
функции не передается скрытый параметр this и она не получает доступ к данным класса (но может обращаться к статическим даным)
Rififi вне форума Ответить с цитированием
Старый 16.07.2015, 17:36   #7
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от robix Посмотреть сообщение
1. Можно ли было вызывать эту функцию если она не была бы static?
2. Что дает слово inline в описании функции в HDR.H ?
3. Получается, что вызвав эту функцию Work автоматически вызывается конструктор класса, где я могу инициализировать его переменные, которые использую в функции Work хотя экземпляр класса EDU при этом не создается, так получается?
1. Класс - это тоже самое, что структура без функций, имеют одинаковый объём, благодаря чему, можно путём "хитрожопости", получить доступ даже к приват переменным... А вот функции хранятся отдельно, поскольку всё это преобразуется в машинный код, который об объектах ничего не знает. Им выдаётся очень длинное имя и вызывается так как вы установили в соглашениях об вызовах.
2. inline - устарела... компилятор найдя эту функцию старается вставить вместо ссылки на функцию, само тело функции, ну это в общих чертах, не факт, что будет быстро, но на функции длиной в менее 4 строчек или обёрток, почему бы и нет. Все заголовочные данные объявляются в заголовочном файле, вопрос не уместен.
3.Класс сам создаёт свои переменные при помощи описанного Вами конструктора и уничтожается посредством деструктора, морочить голову этим не зачем.

P.S. статик функции неприкольны, использование переменных класса невозможно, не конечно можно, но такие темки крутят, только при создании своих "Окон"
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 16.07.2015 в 17:47.
Perchik71 вне форума Ответить с цитированием
Старый 16.07.2015, 17:39   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
tempClass.Get20();
А-а-а, дошло... Согласен.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2015, 17:57   #9
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
статик функции неприкольны, использование переменных класса невозможно
Для того они и созданы, чтоб принадлежать какому-то классу, но не зависеть от переменных объекта класса.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 17.07.2015, 17:02   #10
robix
Пользователь
 
Регистрация: 16.07.2015
Сообщений: 31
По умолчанию

Спасибо за ответы.

Последний раз редактировалось robix; 18.07.2015 в 00:09.
robix вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции из класса mc13 Общие вопросы по Java, Java SE, Kotlin 11 08.02.2015 20:52
Вызов функции из одного класса кнопкой из другого класса lexflax Qt и кроссплатформенное программирование С/С++ 1 12.12.2014 21:48
Вызов глобальной функции из объекта класса Darthriddikc Общие вопросы C/C++ 3 22.12.2013 21:03
C# Вызов метода без создания объекта. Предотвращение изменения фокуса. Colder M Помощь студентам 3 03.05.2011 23:42
Вызов методов объекта из функции? jojahti Общие вопросы C/C++ 3 03.08.2009 16:57