Note: λ΅μμ MS μλλ νμ»΄ νκΈ λ±μΌλ‘ μμ± ν PDF νμΌλ‘ λ³ν ν μ μΆνμκΈ° λ°λλλ€. λ³Έ μνμ Take-home exam μΌλ‘ κ΅μ¬ λ μΈν°λ· μμ μλ£λ₯Ό μ°Έκ³ ν΄μ νμ΄λ μ’μ΅λλ€. κ·Έλ¬λ λ€λ₯Έ μ¬λκ³Όμ μμλ κΈμ§ν©λλ€. λ΅μμ λ§κ° μν μ΄νμλ λ°μ§ μμΌλ κΌ λ§κ°μκ° μμ LMS λ₯Ό ν΅ν΄ μ μΆνμκΈ° λ°λλλ€. λ¬Έμμ¬νμ μ‘°μ±ν κ΅μμκ² μ΄λ©μΌ ([email protected]) μ ν΅ν΄ μ°λ½ λ°λλλ€.
1. λ€μ κ°λ
λ€μ΄ κ°κ° 무μμ λ»νλμ§ νλμ€ λ΄μΈλ‘ κ°λ΅ν κΈ°μ νμμ€. (κ° 4 μ , μ΄ 28 μ )
A. Pure virtual function
B. Function overloading
C. Function overriding
D. Dynamic binding
E. Abstract base class
F. Generic programming
G. Event-driven programming
2. C++ Standard Template Library μ algorithm λ€μ iterator λ₯Ό μ¬μ©νλλ‘ μ€κ³λμ΄ μλ€. iterator λ₯Ό μ¬μ©νλ κ²μ μ₯μ μ΄ λ¬΄μμΈμ§μ λν΄ κ°λ΅νκ³ λͺ ννκ² κΈ°μ νμμ€. (4 μ )
3. Has-a relationship μ ꡬννκΈ° μν λ κ°μ§ λνμ μΈ λ°©λ²μΌλ‘ containment μ private inheritance κ° μλ€. Has-a relationship μ΄ λ¬΄μμΈμ§ κΈ°μ νκ³ , λν containment μ private inheritance μ μ₯λ¨μ μ λΉκ΅νμμ€. (8 μ )
4. Private inheritance μ protected inheritance μ μ°¨μ΄μ μ μμΈν κΈ°μ νμμ€. (4 μ )
5. μ½λλ₯Ό μ€νμμΌ°μλ μΆλ ₯λλ λ΄μ©μ 무μμΈκ°? κ·Έλ¦¬κ³ μ κ·Έλ° μΆλ ₯μ΄ λμ€λκ°? λ€μ μ½λλ₯Ό μ€νμμΌ°μ λ μΆλ ₯λ λ΄μ©μ μ κ³ , κ·Έ μ΄μ λ₯Ό κ°λ¨ν κΈ°μ νμμ€. (8 μ )
class Base { public:
Base(int n=0) : m_n(n) {} virtual ~Base() {}
virtual void display() const {
std::cout << “Base: ” << m_n << std::endl;
} private:
int m_n;
}; class Derived1 : public Base { public:
Derived1(int n=0) : Base(2*n), m_n(n) {}
~Derived1() {} void display() const { Base::display();
std::cout << “Derived1: ” << m_n << std::endl;
} private:
int m_n;
}; class Derived2 : public Base { public:
Derived2(int n=0) : Base(3*n), m_n(n) {}
~Derived2() {} void display() const { Base::display();
std::cout << “Derived2: ” << m_n << std::endl;
} private:
int m_n;
};
class DDerived : public Derived1, public Derived2
{ public:
DDerived(int n, int m) : Derived1(n), Derived2(m) {} ~DDerived() {}
void display() const { Derived1::display();
Derived2::display();
}
};
int main()
{
std::unique_ptr<Derived1> pt(new DDerived(3,5)); pt->display();
return 0;
}
6. λ€μμ μ¬κ· νΈμΆμ μ΄μ©νμ¬ factorial μ κ³μ°νλ μ½λμ΄λ€.
int factorial(int n) { if(n == 0) return 1;
else return n*factorial(n-1); }
μ΄λ₯Ό template μ μ΄μ©νμ¬ μλμ κ°μ΄ λ°κΏ μ μλ€. μ΄λ κ² template μ μ΄μ©νλ λ°©λ²μ μ₯μ μ μ€μ factorial κ³μ°μ λ°νμμ νλ λμ μ»΄νμΌ νμμ ν μ μμ΄μ νλ‘κ·Έλ¨μ μ€νμκ°μ λ¨μΆμν¬ μ μλ€λ μ₯μ μ΄ μλ€. μ΄ λ λΉμΉΈμ νμν μ½λλ₯Ό template
specialization μ μ΄μ©νμ¬ μμ±νμμ€. (8 μ )
template<int N> struct Factorial {
enum { value = N * Factorial<N-1>::value };
};
int main()
{
using namespace std;
int a = Factorial<5>::value; cout << a << endl; return 0;
}
7. μλμ μ½λλ C++11 νμ€ λΌμ΄λΈλ¬λ¦¬μμ μ 곡νλ μ€λ§νΈ ν¬μΈν° μ€ νλμΈ unique_ptr μ κ°λ΅ννμ¬ κ΅¬νν ν΄λμ€μ΄λ€. μλμ μ½λλ₯Ό μμ±νκΈ° μν move constructor μ move assignment operator μ μ½λλ₯Ό μμ±νμμ€. (8 μ )
template<class T> class my_unique_ptr { public:
my_unique_ptr() : m_ptr(nullptr) {} explicit my_unique_ptr(T* p) : m_ptr(p) {} my_unique_ptr(const my_unique_ptr& p) = delete;
// move constructor
~my_unique_ptr() { delete m_ptr; }
my_unique_ptr& operator=(const my_unique_ptr& p) = delete;
// move assignment operator
T& operator*() { return *m_ptr; } const T& operator*() const { return *m_ptr; }
T& operator->() { return *m_ptr; }
const T& operator->() const { return *m_ptr; }
private:
T* m_ptr;
};
8. μ½λμλ λ°νμμλ°μν μ μλνκ°μ§ λ¬Έμ μ μ΄ μ‘΄μ¬νλ€. μ΄ λ¬Έμ μ μ΄ λ¬΄μμΈκ°? κ·Έλ¦¬κ³ μ΄ λ¬Έμ μ μ ν΄κ²°νκΈ° μν΄μλ μ½λλ₯Ό μ΄λ»κ² μμ ν΄μΌ νλκ°? SomeClass μ SomeException ν΄λμ€λ λͺ¨λ μ μ ν μ μλμ΄ μλ€κ³ κ°μ νλ€. (8 μ )
void foo() { SomeClass a(1);
SomeClass* p = new SomeClass(2); // …
if(b_error) {
delete p;
throw SomeException(); } // … delete p;
}
void bar() { SomeClass a(3);
SomeClass* p = new SomeClass(4); // … foo(); // …
delete p;
} int main() { try { bar();
}
catch(SomeException& e) {
std::cout << e.what() << std::endl;
}
return 0;
}
9. λ€μ μ½λμμ C-style μ type cast μ°μ°μλ€μ κ°κ° κ·Έμ λμνλ static_cast, const_cast, reinterpret_cast, dynamic_cast λ‘ λ³κ²½ν μ½λλ₯Ό μμ±νμμ€. (8 μ )
class Base { // …
};
class Derived : public Base { // …
}; int main() { int a = 5; double b;
const int* c = &a;
b = (double)a;
int* d = (int*)c; int f = 0xA0000000;
unsigned char* e = (unsigned char*)f;
Base* p = new Derived;
Derived* p2 = (Derived*)p;
return 0;
}
10. μ½λμ Vec2D λ 2 μ°¨μ 벑ν°λ₯Όλ€λ£¨κΈ° μν template class μ΄λ€. μλ μ½λμ main ν¨μμμλ Vec2D<int>μ Vec2D<float>μ μλ‘ λ€λ₯Έ λ°μ΄ν° νμ
μ Vec2D μ€λΈμ νΈ μ¬μ΄μ λ§μ
μ°μ°μ μννλ κ²μ 보μ¬μ€λ€. μ΄ λ§μ
μ°μ°μ ꡬννκΈ° μν operator+ μ μ€λ²λ‘λ©μ΄ νλμμΌλ‘ νμλμ΄ μλ€. μ¬κΈ°μ μ΄ μ½λμ νμν μ μ ν prototype μ λΉμΉΈμ μΆκ°νμμ€. μ€λ²λ‘λ©λ operator+λ template function μΌλ‘ λμ΄ μμΌλ©°, Vec2D<int>μ Vec2D<float>, λλ Vec2D<double>κ³Ό Vec2D<long>κ³Ό κ°μ μμμ μλ‘ λ€λ₯Έ λ°μ΄ν° νμ
μ Vec2D μ€λΈμ νΈ κ°μ λ§μ
μ°μ°μ μ§μνλ€. λν Vec2D<int> μ€λΈμ νΈμ Vec2D<float> μ€λΈμ νΈμ λ§μ
μ°μ° μ κ²°κ³Όλ‘ λμμΌ λλ νμ
(Vec2D<float>) μ΄ μλμΌλ‘ κ²°μ λλ€.
(4 μ )
template<typename T> class Vec2D { public: Vec2D() {}
Vec2D(T x_, T y_) : x(x_), y(y_) {}
T x, y;
};
{ return Vec2D<decltype(a.x+b.x)>(a.x + b.x, a.y + b.y) ;
}
template<typename T>
std::ostream& operator<<(std::ostream& os, const Vec2D<T>& v)
{
os << “[” << v.x << “, ” << v.y << “]”; return os;
}
int main()
{ using namespace std;
Vec2D<int> a(1,2);
Vec2D<float> b(3.0f, 2.0f);
cout << a << ” + ” << b << ” = ” << a+b << endl; return 0;
}
11. μ½λμ μ§μ λ³μμΈ data λ integer κ°λ€μ λ΄κ³ μλ vector μ΄λ€. μλ μ½λμμ νλ μμΌλ‘ νμλ μ½λλ μ΄ data μ κ°κ°μ κ°λ€μ μ‘°μ¬νμ¬ upper_bound λ³΄λ€ ν° κ°λ€μ upper_bound λ‘ κ°μ λ³κ²½νκ³ , lower_bound λ³΄λ€ μμ κ°λ€μ lower_bound λ‘ λ³κ²½νλ μμ
μ μννλ€. μλ νλμμΌλ‘ νμλ μ½λμ λμΌν μμ
μ μννλ 3 κ°μ§μ μ½λλ₯Ό μμ±νμμ€. κ°κ°μ μ½λλ μλμ A,B,C λ‘ νμλ λ΄μ©μ κ°κ° νμ©νμ¬ μμ±λμ΄μΌ νλ€.
(12 μ )
A. for-loop μ iterator μ΄μ©
B. std::transform ν¨μμ lambda ν¨μ μ΄μ©
C. std::for_each ν¨μμ lambda ν¨μ μ΄μ©
#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
int main()
{
using namespace std;
vector<int> data{11, 17, 4, 10, 29, 4, 18, 18};
int upper_bound = 20; int lower_bound = 10;
for(int i = 0; i < data.size(); i++) { if(data[i] > upper_bound) { data[i] = upper_bound;
}
else if(data[i] < lower_bound) { data[i] = lower_bound;
} }
for(auto x: data) cout << x << ” “; cout << endl;
return 0;
}



