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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2012, 18:45   #1
wowhow
Пользователь
 
Регистрация: 21.10.2012
Сообщений: 13
Вопрос Передача класса в качесве параметра ф-ии

Читаю Павловскую Т.А. Программирование на языке высокого уровня С++
В разделе с функциями там пишется что параметры передаются по значению, по адресу и по ссылке.

Имеется такой код.

Код:
#include <iostream>
#include <Windows.h>


class Something 
{
	int m_i;
public:
	
	int GetSome() 
	{
		return m_i;
	};

	void SetSome(int i) 
	{
		m_i = i;
	};
	Something(): m_i(0) {};
	Something(int i) { m_i = i; };
};

void ShowSomething( Something s ) 
{
	std::cout << "Something = " << s.GetSome() << std::endl;
};

void ShowSomething2 ( Something &s)
{
	std::cout << "Something = " << s.GetSome() << std::endl;
}

void ShowSomething3 ( Something* s) 
{
	std::cout << "Something = " << s->GetSome() << std::endl;	
}


int main() 
{
	Something s(111);

	ShowSomething(s);
	ShowSomething2(s);
	ShowSomething3(&s);

	std::cin.get();
	return EXIT_SUCCESS;
}
Вопрос как передается класс в ShowSomething () по значению? Т.е перед работой ф-ии создается его копия и далее она заносится в стек и там ф-я с этой копией работает, т.е. таким образом очень медленно получается и лучше передавать по ссылке или указателю?

И еще вопрос что означает запись вида void ShowSomething ( Something &s ) const, что это за константа в конце ?
wowhow вне форума Ответить с цитированием
Старый 20.11.2012, 19:51   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
И еще вопрос что означает запись вида void ShowSomething ( Something &s ) const, что это за константа в конце ?
Это значит - я метод, который не меняет поля класса, мамой клянусь
p51x вне форума Ответить с цитированием
Старый 20.11.2012, 19:53   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Т.е перед работой ф-ии создается его копия и далее она заносится в стек и там ф-я с этой копией работает
Да, именно так. Медленнее только в случае передачи больших классов, передавая int по ссылке, вы потеряете в скорости, так как в реализации ссылки - те же указатели.

Код:
void ShowSomething ( Something &s ) const
Если это функция, то ничего не значит, более того, это ошибка. Если метод класса, то этот метод можно вызывать для константных объектов и он не меняет значения членов, не помеченных как mutable.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 21.11.2012, 08:09   #4
wowhow
Пользователь
 
Регистрация: 21.10.2012
Сообщений: 13
По умолчанию

еще вопрос
Код:
std::cout << "class size = " << sizeof(Something) << std::endl;
Почему размер класса 4 байта ? Разве у него нет методов? Или они ничего не весят? Или его можно как-то реально взвесить?
wowhow вне форума Ответить с цитированием
Старый 21.11.2012, 08:40   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Почему размер класса 4 байта ? Разве у него нет методов? Или они ничего не весят? Или его можно как-то реально взвесить?
Не первое и не второе. Экземпляр класса - это набор данных. Методы находятся "отдельно" в оперативной памяти, они существуют для всего класса, а не для каждого объекта. Вольно говоря, методы не входят в размер экземпляра класса по той же причине, что и статические члены.
На самом деле, метод класса - это обычная функция. Скажем,
Код:
int MyClass::Method(char c, void* mem);
эквивалентно (для невиртуальных функций)
Код:
int _MyClass__Method(char c, void* mem, MyClass* this);
Разумеется, то, в сколько функций можно подставить аргументом указатель на экземпляр класса, не меняет размер этого экземпляра.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передача параметра маГГ85 PHP 4 18.01.2012 11:35
Конструктор класса не хочет принимать в качестве параметра адрес объекта другого класса Jugger Помощь студентам 3 05.01.2012 04:10
Передача имени класса как параметра Квэнди Общие вопросы Delphi 14 06.04.2009 20:09
Передача метода класса в качестве параметра в другой метод Dmytry87 Общие вопросы C/C++ 0 12.11.2008 15:28
Передача параметра в поток joker Win Api 10 22.12.2007 12:53