С++0x и решение проблем инициализации
3 мин
В статьях на хабре уже касались стандарта С++0x, а в частности лямбда-выражений. Я хотел написать еще про пару изменений и дополнений, которые внесут в С++. И без лишних слов сразу к делу.
Типизированный язык программирования
В статьях на хабре уже касались стандарта С++0x, а в частности лямбда-выражений. Я хотел написать еще про пару изменений и дополнений, которые внесут в С++. И без лишних слов сразу к делу.struct A {
A (int i) {}
};
struct B {
B (A a) {}
};
int main () {
int i = 1;
B b(A(i)); // (1)
return 0;
}
* This source code was highlighted with Source Code Highlighter.hr = pStream->Read((void*)pbArray, (ULONG)cbSize, NULL);
* This source code was highlighted with Source Code Highlighter.hr = pStream->Read((void*)&pbArray, (ULONG)cbSize, NULL);
* This source code was highlighted with Source Code Highlighter.



A::A(int x) : b(x) {}A::A(int x) { b = new B(x); }
Итак, вот небольшая программа на C++:
#include <iostream>
class A {
private:
int a;
int b;
public:
A(int x) : b(x), a(b) {}
void dump() {
std::cout << "a=" << a << " b=" << b << std::endl;
}
};
int main() {
A a(42);
a.dump();
return 0;
}
a=42 b=42
Специализация шаблонов является одной из «сложных» фичей языка с++ и использутся в основном при создании библиотек. К сожалению, некоторые особенности специализации шаблонов не очень хорошо раскрыты в популярных книгах по этому языку. Более того, даже 53 страницы официального ISO стандарта языка, посвященные шаблонам, описывают интересные детали сумбурно, оставляя многое на «догадайтесь сами — это же очевидно». Под катом я постарался ясно изложить базовые принципы специализации шаблонов и показать как эти принципы можно использовать в построении магических заклинаний.#include <iostream>
using namespace std;
class A {
public:
virtual void Foo (int n = 10) {
cout << "A::Foo, n = " << n << endl;
}
};
class B : public A {
public:
virtual void Foo (int n = 20) {
cout << "B::Foo, n = " << n << endl;
}
};
int main() {
A * pa = new B ();
pa->Foo ();
return 0;
}