template < class T > class L : public T{ }; class a { }; class b: public L< a > { }; int _tmain(int argc, _TCHAR* argv[]) { L< a >* pa = new L< a >; L< b >* pb = new L< b >; pa = pb; return 0; }
В операциях с указателями участвуют два объекта: сам указатель и объект, на который он ссылается. Помещение ключевого слова const перед объявлением указателя делает константой объект, а не указатель. Для объявления самого указателя в качестве константы, используется оператор *const, а не просто *. Нет операторя объявления const*, поэтому ключевое слово const слева от * интерпретируется как часть базового типа.
const char* s - указатель на константу типа char.
char const* s - указатель на константу типа char.
char *const s = "значение" - константный указатель на char. Он должен быть инициализировн каким-либо значением или быть обьявлен как extern. Так же места "значения" может быть указатель типа char*.
const char *const s = "значение" - константный указатель на константу типа char
Проще всего битовые поля:
struct byte { unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; unsigned char b8:1; }; union bits { char symb; struct byte bit; } u; u.symb = 240; unsigned char k = 0; k = u.bit.b1+u.bit.b2+u.bit.b3+u.bit.b4+u.bit.b5+u.bit.b6+u.bit.b7+u.bit.b8 ; int k1 = k;
Надо уточнить что подразумевается под схожей функциональностью. Если под ней
понимается наличие функций с идентичными сигнатурами и разными реализациями,
то самое простое это :
Cоздать интерфейс, с общими методами и реализовать его в классах - источниках.
А потом в классу приёмнику передать объект интерфейса, либо как параметр функции,
либо конструктора.
Если же под схожестью понимается какая-то общая область, т.е.
функции имеют различные сигнатуры но делают похожие вещи, то такой
ответ:
Эту задачу можно решить с помощью паттерна проектирования Visitor.
Паттерн проектирования - описание взаимодействия объектов и классов,
адаптированных для решения общей задачи проектирования в конкретном контексте.
Патерн Vizitor - описывает операцию, выполняемую с каждым объектом из
некоторой структуры. Паттерн Visitor позволяет определить новую операцию,
не изменяя классы этих объектов. Как решение именно этой конктретной задачи можно рассмотреть
такой вариант:
Надо наследовать эти классы от одного общего, в котором есть
виртуальный метод Visit, в нутри которого вызываются нужные нам методы.
А наш класс просто вызывает этот метод.
P.S. Тут просто ситуация, когда вам могут задать этот вопрос
с целью проверить ваше знание паттернов, и ответом на этот вопрос будут ждать
рассказа о паттерне Visitor.
Типы - System.String и множество типов System.Text а так же его подмножество System.Text.RegularExpressions. System.String - это базовый тип. Он во время инициализации создаёт строку и предлагает ряд методов для работы с ней. Но у него есть недостаток, он инициализирует строку 1 раз и не меняет её в процессе работы. Это так называемый неизменяемый тип данных. Т.е. при попытке что-либо изменить в строке будет создаваться новая строка, а старая оставаться неизменной. Чтоб не плодить в памяти множество строк есть класс System.Text.StringBuilder. Он выделаят пямать под строку, либо вы её выделяете сами в момент инциализации класса и работает в рамках выделенной памяти, в том случае когда памяти не хватает он довыделяет ещё кусок памяти к уже существующей. Остальные класы предназначенны для преобразования из одной кодировки в другую и для реализации регулярных выражений.
наверх.
IDisposable - это интерфейс с одним методом - Dispose(), который следует
перегрузить в классе для того чтоб он освобождал нужные вам ресурсы.
Его испльзуют для того чтоб ресурсы используемые классом
освобождались не когда ссылка на них выйдет
из области видимости и до них доберётся сборщик мусора,
а сразу же после того как они вышли из области видимости.
Так же для того чтоб не вызывать метод Dispose() вашего класса явно в коде
используют ключевое слово using(){}, где в скобках помещают инициализацию класса
а в нутри фигурных скобок осуществляется работа с ним. Фигурные скобки определяют область видимости
инициализированного класса. Если вариант с using вам не подходит, то следует вызывать
метод Dispose() явно.
IPrincipal - это интерфейс предназначенный для организации защиты приложений.
С помощью интерфейса IPrincipal можно реализовать код проверяющий, можно ли
выполнять защищённый код для этого пользователя, а так же код устанавливающий
разрешения для данного пользовавтеля.
У него есть свойство Identity( позваляет установить или получить группу пользователей
к которой относится данный пользователь) и метод IsInRole позволяет узнать имеет ли данная
группа необходимое разрешение.
Singletone - это паттерн, поэтому сначало определение патерна:
Паттерн проектирования - описание взаимодействия объектов и классов, адаптированных для
решения общей задачи проектирования в конкретном контексте.
Singletone - это паттерн проектирования, который гарантирует, что некоторый класс может
иметь только один экземпляр и предоставляет глобальную точку доступа к нему.
Он имеет статическое поле с указателем на созданный экземляр и статический метод,
позволяющий создавать экземпляр или предоставлять к нему доступ. Конструктор с деструктором при этом
объявляются либо как Protected, либо как Private, чтобы их нельзя бало вызвать напрямую.
Создание объекта этого класса делается только через статическую функцию. Protected делают
для того чотб можно было создать экземпляр в потомках и регестрировать его в неком массиве
singleton'ов. Обращаться к которому можно толко через Instance. Простой пример singletone:
class Singleton { private static object SyncRoot = new object(); private static Singleton _instance = null; private Singlton(){}; public static Singleton Instance { get { if(_instance == null) { lock(SyncRoot) { if(_instance == null) _instance = new Singleton(); } } return _instance; } } ... }наверх.
Статические методы, как и поля относятся к классу в целом, а не к конкретному объекту этого класса. Т.е. статические методы не получают указателя this, отсюда не имеют доступа к обычным методам и параметрам класса. Если в одном классе объявить 2 метода с идентичными сигнатурами, один из которых будет статическим, а другой обычным, то компилятор выдаст ошибку. Пример, ниже компилироваться не будет:
class A { public static void U(){} public void U(){} }наверх.