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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2013, 18:17   #11
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Нужна чисто виртуальная функция.
Которая создаётся при помощи ключевого слова virtual. И вообще, дурацкие вопросы порождают дурацкие ответы:
Цитата:
Четыре картинки (тест "найди лишнюю").
Молоток, гвоздь, клещи, стакан.
Ребёнка 6 лет просят рассуждать вслух...
- "Если забивать гвоздь молотком, попивая воду из стакана - лишние клещи"
- "Если вытаскивать гвоздь клещами, попивая воду из стакана - лишний молоток"
- "Но мама сказала 'не выпендривайся', поэтому лишний стакан"
Abstraction вне форума Ответить с цитированием
Старый 30.01.2013, 18:45   #12
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Эх жалко не могу на весы... я поржал от души
Но честно Virtual не даёт оснований ваще..

для того что бы класс был абстрактным необходима хотя бы одна такая фуна

Код:
virtual atype namefunc(arguments) = 0;
только тогда инициализация класса не возможна.
Код:
virtual atype namefunc(arguments);
не даёт ваще никаких гарантий.. скорее подразумевается что вы перекрываете виртуальную фуну где то там в отце.
____
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 30.01.2013 в 18:47. Причина: О боже сколько ошибок
Perchik71 вне форума Ответить с цитированием
Старый 30.01.2013, 20:14   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
"В методе класса" - как бы тоже возможный ответ (хотя делать так не надо никогда):
Код:
class MyClass{
  static int m_value; //Описание
  static void InitValue(int value){ m_value = value;} //Инициализация
}

int MyClass::m_value; //Определение без инициализации
а хо-хо не хо-хо?

http://liveworkspace.org/code/1WrndV$1

рекомендую подучить тему: когда запускаются конструкторы, а когда operator=
_Bers вне форума Ответить с цитированием
Старый 31.01.2013, 00:33   #14
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Так у int конструктора не завезли. Более того, константы встроенного типа можно инициализировать при объявлении:
Код:
class MyClass{
  const static int Variable = 42;
};
Если никакой код не получает её адреса, её можно даже не определять... а можно определить, но при определении уже не инициализировать.
Abstraction вне форума Ответить с цитированием
Старый 31.01.2013, 03:00   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Так у int конструктора не завезли. Более того, константы встроенного типа можно инициализировать при объявлении:
Код:
class MyClass{
  const static int Variable = 42;
};
Если никакой код не получает её адреса, её можно даже не определять... а можно определить, но при определении уже не инициализировать.
Объявление статического мембера не является его определением. А является лишь объявлением.Исключение сделано только для константных статических int, которые можно определять в месте объявления ( в объявлении класса). И это есть синтаксический сахар.
Для всех прочих - за пределами класса. И если этого не сделать, объект не будет определен:

http://liveworkspace.org/code/VriGX$6

Обрати внимание на текст ошибки:
source.cpp.text.startup+0x2): undefined reference to `Example::val'

Сущность объявлена, но не определена. Линкер нигде не нашел её определения.

Следующий эксперимент показывает, что определить статический мембер в конструкторе класса невозможно:
http://liveworkspace.org/code/VriGX$7

Это связанно с тем, что статический член класса не является собственностью класса. А является собственностью единиц трансляций.

(Впрочем, в туловище конструктора класса в принципе нельзя определить мемберы. Даже если они и не статические. Поскольку конструкторы не_статических мемберов срабатывают в списках инициализации класса, а не в туловище его конструктора. К моменту запуска конструктора, мемберы класса будут уже построены. И у них сработает оператор=)


В языке с++ действует правило РАИ: захват ресурса и есть его инициализация.

Если твоими словами: определение объекта и есть его инициализация.
Это справедливо для всех типов языка с++ без исключения. В том числе и для int.

int так же, как и все остальные обладает конструктором.


Так же, есть оговорка для типа int, связанная с наследством от языка си (который, как известно не обладает раи)

Код:
#include<iostream>
int main()
{
   int val1;
   int val2 = int();
   
   std::cout<<"val1 = "<<val1<< std::endl; //на усмотрение компилятора
   std::cout<<"val2 = "<<val2<< std::endl; //гарантированно ноль
   return 0;
}
Например, студия 2010 в переменной val1 оставила с мусором
(можно считать, что был запущен ничего не делающий дефолтный конструктор).

А гцц 4.7.2 заполнил нулем (можно считать, что был запущен дефолтный конструктор, который по дефолту записал в память ноль)

Стандарт гарантирует, что явно указанный дефолтный конструктор int() всегда вернет ноль.

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

template<class T>
void Foo()
{
T value; //будет запуск дефолтного конструктора
}

Даже если это окажется "ничего не делающий" конструктор типа int
_Bers вне форума Ответить с цитированием
Старый 31.01.2013, 10:56   #16
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Объявление статического мембера не является его определением. А является лишь объявлением.Исключение сделано только для константных статических int, которые можно определять в месте объявления ( в объявлении класса). И это есть синтаксический сахар.
С другой стороны, если вернуться к изначальному вопросу, как он был задан - налицо инициализация статического члена класса значением "в теле класса", хотя бы синтаксически. Причём это же нельзя считать определением (иначе получилось бы, что MyClass::Variable определена столько раз, во сколько единиц трансляции включён заголовок, что было бы ошибкой).

Что же до конструктора int, то, по-моему, очень хорошо об этом сказал Мейерс: в разных "частях" C++ игра идёт по чуть разным правилам. Если мы находимся в "части" ООП C++, то int можно считать вариантом класса, со своим конструктором; если мы находимся в "части" C++-как-C, то int - просто тип переменной, определение которой не влечёт никаких дополнительных действий (в соответствии с принципом C++ "не платишь за то, чего не используешь").

А RAII вроде как не возводится в принцип C++ как такового, разве нет? Это же просто идиома программирования - разработчику решать, нужно ли к ней прибегать в каждом конкретном случае. В общем случае, определение и инициализация могут быть разнесены во времени (например, при ленивой инициализации).
Abstraction вне форума Ответить с цитированием
Старый 31.01.2013, 15:19   #17
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
С другой стороны, если вернуться к изначальному вопросу, как он был задан - налицо инициализация статического члена класса значением "в теле класса", хотя бы синтаксически.
Возвращаясь к изначальному вопросу: нельзя инициализировать статический член класса в методах этого класса. Даже просто синтаксически. Даже, если это константный статический инт.

Константный интовый статик можно определить в объявлении класса (но не в определении класса). Все прочие - за его пределами.

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Что же до конструктора int, то, по-моему, очень хорошо об этом сказал Мейерс: в разных "частях" C++ игра идёт по чуть разным правилам. Если мы находимся в "части" ООП C++, то int можно считать вариантом класса, со своим конструктором; если мы находимся в "части" C++-как-C, то int - просто тип переменной, определение которой не влечёт никаких дополнительных действий (в соответствии с принципом C++ "не платишь за то, чего не используешь").
Ну можно и так сказать.

Иногда бывают рантайм ошибки связанные с использованием неинициализированных переменных.

Это пример не оч хорошего дизайна с++. Поэтому, в шаблончиках, при создании объекта по дефолту, лучше явно указывать:

templa<class T> void Foo()
{
T t = t(); //гарантируем запуск дефолтного конструктора для примитивов
}

Современные компиляторы оптимизируют создание безымянного объекта, и копирующий конструктор. Поэтому, будет только один запуск конструктора t();

Цитата:
Сообщение от Abstraction Посмотреть сообщение
А RAII вроде как не возводится в принцип C++ как такового, разве нет? Это же просто идиома программирования - разработчику решать, нужно ли к ней прибегать в каждом конкретном случае. В общем случае, определение и инициализация могут быть разнесены во времени (например, при ленивой инициализации).
Раи - основополагающий принцип ООП. А ООП - центральная тема с++
На плюсах создание объекта - есть запуск его конструктора.

В отличие от языка си, где нужно сначала выделить память, а потом в ручную её чем то заполнить.

Конечно, на плюсах тоже можно запускать функции си, типа маллоков всяких.
Но в том то и дело, что это - сишные функции, а не плюсовые.
_Bers вне форума Ответить с цитированием
Старый 31.01.2013, 21:43   #18
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Все Ваши ответы (кроме 4,5) не верны.
Цитата:
5. Какое утверждение не является правильным ?
A) Конструктор класса не может принимать параметров.
B) Класс не может содержать более одного конструктора.
C) Класс может содержать несколько конструкторов.
D) Конструктор класса всегда объявляется в секции public.
ТС выбрал "А", но еще:
конструкторы можно перегружать, поэтому стоит пометить и В

конструктор не всегда объявляется в public, поэтому ответ D тоже стоит отметить

ответ на 4 вопрос верный, остальные не смотрел

----а вот посмотрел:
Цитата:

2d

4d
5acd
6d
7d
8b
9c
10a
ответ на 9 вопрос ТС тоже верно указал, кстати.

Последний раз редактировалось rrrFer; 31.01.2013 в 21:57. Причина: добавил
rrrFer вне форума Ответить с цитированием
Старый 31.01.2013, 22:00   #19
Suby
Пользователь
 
Аватар для Suby
 
Регистрация: 03.11.2012
Сообщений: 89
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
конструктор не всегда объявляется в public
А когда он объявляется не в public?
Suby вне форума Ответить с цитированием
Старый 31.01.2013, 22:20   #20
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Suby Посмотреть сообщение
А когда он объявляется не в public?
Когда так захотелось программисту.
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тест Sparky Помощь студентам 0 19.06.2009 19:30
Тест 0.5 Лунатик222 Софт 0 03.03.2009 22:20
ТЕСТ Ярослав Помощь студентам 14 18.04.2008 23:37
Тест SERG1980 БД в Delphi 1 20.07.2007 12:58