AcceleratedC++/Chapter9 | AcceleratedC++/Chapter11 |
1. Chapter 10 Managing memory and low-level data structures ¶
μ§κΈκΉμ§λ vector, stringλ± STLμ΄ κΈ°λ³Έμ μΌλ‘ μ 곡νλ μλ£κ΅¬μ‘°λ₯Ό ν΅ν΄μ νλ‘κ·Έλλ°μ νμλ€.
μ΄μ κ·Έ λμμ리λ₯Ό μμλ³Ό μ°¨λ‘μ΄λ€.
low-levelμ΄λΌλ ννμ μ΄λ° λ΄μ©λ€μ΄ STLꡬνμ κ·Όκ°μ μ΄λ£¨λ©°, νλμ¨μ΄μ λμ λ°©μκ³Ό λ§€μ° ν‘μ¬νκΈ° λλ¬Έμ΄λ€.
μ΄μ κ·Έ λμμ리λ₯Ό μμλ³Ό μ°¨λ‘μ΄λ€.
low-levelμ΄λΌλ ννμ μ΄λ° λ΄μ©λ€μ΄ STLꡬνμ κ·Όκ°μ μ΄λ£¨λ©°, νλμ¨μ΄μ λμ λ°©μκ³Ό λ§€μ° ν‘μ¬νκΈ° λλ¬Έμ΄λ€.
1.1. 10.1 Pointers and arrays ¶
λ°°μ΄(array) vectorμ μ μ¬νμ§λ§ vectorλ§νΌ νΈλ¦¬νμ§λ μλ€.
ν¬μΈν°(pointer) μμ μ κ·Ό λ°λ³΅μλ‘μ, λ°°μ΄μ μμλ€μ μ κ·ΌνκΈ° μν΄μλ νμ, λ€λ₯Έ μ©λλ‘λ λ§μ΄ μ΄μ©λλ€.
ν¬μΈν°(pointer) μμ μ κ·Ό λ°λ³΅μλ‘μ, λ°°μ΄μ μμλ€μ μ κ·ΌνκΈ° μν΄μλ νμ, λ€λ₯Έ μ©λλ‘λ λ§μ΄ μ΄μ©λλ€.
1.1.1. 10.1.1 ν¬μΈν° ¶
ν¬μΈν°(pointer) | μ£Όμλ₯Ό λνλ΄λ κ° |
μ£Όμ μ°μ°μ(address operator) | κ°μ²΄μ μ£Όμλ₯Ό 리ν΄νλ€. |
μμ°Έμ‘° μ°μ°μ(dereference operator) | ν¬μΈν° pκ° κ°λ¦¬ν€λ κ°μ²΄λ₯Ό 리ν΄νλ€. |
ν¬μΈν°λ νμ μ κ°λλ° μΌλ°μ μΌλ‘ type-name * μΌλ‘ μ μνλ€.
~cpp int *p; // *pλ int νμ μ κ°λλ€. int* p; // pλ int*λΌλ κ²μ κ°μ‘°νλ ννμ΄λ€. Cμ»΄νμΌλ¬λ * μ£Όλ³μ 곡백μ 무μνκΈ° λλ¬Έμ μκΈ°μ 2κ° ννμ μμ ν λμΌνλ€.
νΌν΄μΌν μ μ λ°©μ
~cpp int* p, q; // pλ int* μΈ ν¬μΈν° νμ, qλ int νμ κ°λ¦¬ν¨λ€.
μμ
~cpp //pointer_example.cpp #include <iostream> using std::cout; using std::endl; int main() { int x = 5; // `p' points to `x' int* p = &x; cout << "x = " << x << endl; // change the value of `x' through `p' *p = 6; cout << "x = " << x << endl; return 0; }
1.1.2. 10.1.2 ν¨μμ λν ν¬μΈν° ¶
β» ν¨μν¬μΈν°λ₯Ό μ²μμΌλ‘ λ€λ£¨λ μ¬λμ μ‘°κΈ μ΄λ €μΈ μ§λ λͺ¨λ₯΄κ² μ΅λλ€. μ’ μ΄λ ΅λλΌλ C, C++μμ λ§μ΄ μ΄μ©λλ ν
ν¬λμ΄λ μ΅νλ 건 νμμ΄κ² μ§μ?
6.2.2 μ μμ λ€λ₯Έ ν¨μμ μΈμλ‘ ν¨μλ₯Ό μ λ¬νλ κ²μ 보μλ€.
ν¨μμ λν΄μ μ°λ¦¬κ° ν μ μλ κ²μ κ·Έ ν¨μμ μ£Όμλ₯Ό μ·¨νκ±°λ, μ€ννλ κ² λ°μλ μλ€.
ν¨μμ λν ν¬μΈν°λ₯Ό μΈμλ‘ μ λ¬νκ³ μμ°Έμ‘° μ°μ°μλ₯Ό ν΅ν΄μ κ·Έ ν¬μΈν°μ μ κ·Όνλ©΄ μ°λ¦¬λ μλμ ν¨μμ μ κ·Όνλ κ²μ΄ κ°λ₯νλ€.
C++μ μκΈ°μ κ°μ ννμΌλ‘ λ§€κ°λ³μλ₯Ό μ§μ νλλΌλ μ΄λ₯Ό μλμΌλ‘ λ€μκ³Ό κ°μ νμΌλ‘ μλ ν λ³νμν¨λ€.
νμ§λ§ μ΄λ¬ν μλ ν λ³νμ ν¨μμ 리ν΄νμλ μ μ©λμ§ μλλ€. λ°λΌμ ν¨μλ₯Ό 리ν΄νλ κ²½μ°μλ λͺ μμ μΌλ‘ ν¬μΈν°μμ λνλ΄μΌν νμκ° μλ€.
κ·Έλ μ§λ§ μΈλ»λ³΄κΈ°μλ μ½λκ° 2λ²μ§Έμ κ²½μ° μ½λκ° μλΉν 볡μ‘νλ€λ κ²μ μ μ μμ΅λλ€.
μ΄λ°μμ λ¬Έλ²μ λ§μ΄ μ¬μ©λμ§λ μμ΅λλ€. (Addition 1μμ μ€λͺ ν©λλ€.)
ν¨μ ν¬μΈν°λ νν λ€λ₯Έ ν¨μμ μΈμλ‘ μ΄μ©λλ€.
6.2.2 μ μμ λ€λ₯Έ ν¨μμ μΈμλ‘ ν¨μλ₯Ό μ λ¬νλ κ²μ 보μλ€.
ν¨μμ λν΄μ μ°λ¦¬κ° ν μ μλ κ²μ κ·Έ ν¨μμ μ£Όμλ₯Ό μ·¨νκ±°λ, μ€ννλ κ² λ°μλ μλ€.
ν¨μμ λν ν¬μΈν°λ₯Ό μΈμλ‘ μ λ¬νκ³ μμ°Έμ‘° μ°μ°μλ₯Ό ν΅ν΄μ κ·Έ ν¬μΈν°μ μ κ·Όνλ©΄ μ°λ¦¬λ μλμ ν¨μμ μ κ·Όνλ κ²μ΄ κ°λ₯νλ€.
~cpp int (*fp)(int); int next(int n) { return n+1; } fp = &next; fp = next; // μκΈ°μ 2κ°μ§ νν λͺ¨λ nextν¨μμ ν¬μΈν°λ₯Ό fpμ λμ νλ κ²μ΄ κ°λ₯νλ€. int i = 0; int n =1; i = (*fp)(i); i = fp(i); // λ§μ°¬κ°μ§λ‘ μ΄ 2κ°μ ννλͺ¨λ μ ν¨ν ννμ΄λλ€.6.2.2μ μ μ‘΄μ¬νλ write_ayalysisμ μ μΈκ΅¬λ¬Έμ μ΄ν΄λ³΄λλ‘ νμ.
~cpp void write_analysis(std::ostream& out, const std::string& name, double analysis(const std::vector<Student_info>&), const std::vector<Student_info>& did, const std::vector<Student_info>& didnt);μκΈ°μμ 3λ²μ§Έ λ§€κ°λ³μλ₯Ό μ΄ν΄λ³΄λλ‘ νμ.
~cpp double analysis(const std::vector<Student_info>&)
C++μ μκΈ°μ κ°μ ννμΌλ‘ λ§€κ°λ³μλ₯Ό μ§μ νλλΌλ μ΄λ₯Ό μλμΌλ‘ λ€μκ³Ό κ°μ νμΌλ‘ μλ ν λ³νμν¨λ€.
~cpp double (*analysis)(const std::vector<Student_info>&)λ°λΌμ μ°λ¦¬κ° μΌλ°μ μΌλ‘ μ¬μ©νλ ν¨μμ ννλ§μΌλ‘λ λ§€κ°λ³μλ‘ ν¨μλ₯Ό μ λ¬μν€λ κ²μ΄ κ°λ₯ν κ²μ΄λ€.
νμ§λ§ μ΄λ¬ν μλ ν λ³νμ ν¨μμ 리ν΄νμλ μ μ©λμ§ μλλ€. λ°λΌμ ν¨μλ₯Ό 리ν΄νλ κ²½μ°μλ λͺ μμ μΌλ‘ ν¬μΈν°μμ λνλ΄μΌν νμκ° μλ€.
~cpp //μ¬λ°λ₯Έ νν typedef double (*analysis_fp)(const vector<Student_info>&); analysis_fp get_analysis_ptr(); // μ΄μ κ°μ΄ μ΄μ©νλ κ²μ΄ κ°λ₯ν©λλ€. //μ¬λ°λ₯΄μ§ μμ νν double (*get_analysis_ptr()) (const vector<Student_info>&);μκΈ°μ μ½λμμ νλ‘κ·Έλλ¨Έκ° μν κΈ°λ₯μ get_analysis_ptr()μ νΈμΆνλ©΄ κ·Έ κ²°κ³Όλ₯Ό μμ°Έμ‘°νμ¬μ const vector<Student_info>&λ₯Ό μΈμλ‘ κ°κ³ double νμ 리ν΄νλ ν¨μλ₯Ό μ»λ κ²μ λλ€.
κ·Έλ μ§λ§ μΈλ»λ³΄κΈ°μλ μ½λκ° 2λ²μ§Έμ κ²½μ° μ½λκ° μλΉν 볡μ‘νλ€λ κ²μ μ μ μμ΅λλ€.
μ΄λ°μμ λ¬Έλ²μ λ§μ΄ μ¬μ©λμ§λ μμ΅λλ€. (Addition 1μμ μ€λͺ ν©λλ€.)
ν¨μ ν¬μΈν°λ νν λ€λ₯Έ ν¨μμ μΈμλ‘ μ΄μ©λλ€.
~cpp template<class In, class Pred> In find_if(In begin, In end, Pred f) { while (begin != end && if f(*begin)) //μ¬κΈ°μ Predλ Pred(*begin)μ΄ μλ―Έλ₯Ό κ°λ λͺ¨λ νμ μ΄ κ°μ©ν©λλ€. ++begin; return begin; } bool is_negative(int n) { return n<0; } vector<int>::iterator i = find_if(v.begin(), v.end(), is_negative); // &is_negative λ₯Ό μ¬μ©νμ§ μλ μ΄μ λ μλνλ³νμΌλ‘ ν¬μΈν°νμΌλ‘ λ³νλκΈ° λλ¬Έμ.
1.1.3. 10.1.3 λ°°μ΄ ¶
λ°°μ΄(Array)
νμ€ λΌμ΄λΈλ¬λ¦¬κ° μλ κΈ°λ³ΈμΈμ΄μ μΌλΆλ‘μ νλ μ΄μμ κ°μ νμ μ κ°μ²΄λ€λ‘ μ΄λ£¨μ΄μ§ μνμ€μ λλ€. λ¨ λ°°μ΄ μμμ κ°―μλ μ»΄νμΌ μμ μ μ μμ΄μΌν©λλ€.
λν λ°°μ΄μ μ΄λ¦μ κ·Έ λ°°μ΄μ μμμ 첫λ²μ§Έ μμλ₯Ό κ°λ¦¬ν€λ ν¬μΈν°νμΌλ‘ μ΄κΈ°ν λκΈ° λλ¬Έμ λ°°μ΄κ³Ό ν¬μΈν°λ λ°μ ν μκ΄ κ΄κ³λ₯Ό κ°κ³ μλ€.
νμ€ λΌμ΄λΈλ¬λ¦¬κ° μλ κΈ°λ³ΈμΈμ΄μ μΌλΆλ‘μ νλ μ΄μμ κ°μ νμ μ κ°μ²΄λ€λ‘ μ΄λ£¨μ΄μ§ μνμ€μ λλ€. λ¨ λ°°μ΄ μμμ κ°―μλ μ»΄νμΌ μμ μ μ μμ΄μΌν©λλ€.
β» C99 νμ€μμλ λ³μλ‘ ν¬κΈ°λ₯Ό λ°μμ λμ μΌλ‘ ν λΉνλ μΌμ΄ κ°λ₯ν©λλ€.
λ°°μ΄μ ν΄λμ€ νμ
μ΄ μλκΈ° λλ¬Έμ λ°°μ΄μ ν¬κΈ°λ₯Ό λνλ΄λ size_typeκ³Ό κ°μ μμλ μμ΅λλ€. λμ μ C Standard Definition μ΄ν <cstddef> μ size_tλ‘ μ§μ λ unsigned νμ
μΌλ‘ λ°°μ΄μ ν¬κΈ°λ₯Ό μ¬μ©ν΄μΌν©λλ€.~cpp const size_t NDim = 3; const size_t PTriangle = 3; double coords[NDim]; double coords1[PTriangle];μκΈ°μ κ°μ ννμ constλ‘ μ§μ λ λ³μλ‘ λ³μλ₯Ό μ΄κΈ°ννκΈ° λλ¬Έμ μ»΄νμΌμμ κ·Έ ν¬κΈ°λ₯Ό μ μ μλ€. λν μκΈ°μ κ°μ λ°©μμΌλ‘ μ½λ©μ νλ©΄ coordμ μλ―Έλ₯Ό λΆμ¬ν μ μκΈ° λλ¬Έμ μ₯μ μ΄ μ‘΄μ¬νλ€.
λν λ°°μ΄μ μ΄λ¦μ κ·Έ λ°°μ΄μ μμμ 첫λ²μ§Έ μμλ₯Ό κ°λ¦¬ν€λ ν¬μΈν°νμΌλ‘ μ΄κΈ°ν λκΈ° λλ¬Έμ λ°°μ΄κ³Ό ν¬μΈν°λ λ°μ ν μκ΄ κ΄κ³λ₯Ό κ°κ³ μλ€.
~cpp *coord = 1.5; //coord λ°°μ΄μ 첫λ²μ§Έ μμλ₯Ό 1.5λ‘ ν λΉνλ€. μ¦, coord[1] = 1.5; μ λμΌν ννμ΄ λλ€.
1.1.4. 10.1.4 ν¬μΈν° μ°μ μ°μ° ¶
ν¬μΈν°λ μΌμ’
μ λ°λ³΅μμ΄λ€. μ΄μ¬μ€μμ λ°°μ΄μ ν¬μΈν°λ₯Ό μ΄μ©ν μ κ·Όμ μκ°ν΄λ³Ό μ μλ€.
coordκ° coordμ 0λ²μ§Έ μμλ₯Ό κ°λ₯΄ν€λ―λ‘
p, qκ° κ°μ λ°°μ΄μ μμλ€μ ν¬μΈν°λΌλ©΄, p-qλ pμ qμ¬μ΄μ μλ μμλ€μ 거리λ₯Ό λνλ΄λ μ μκ° λλ€.
κ·Έλ¬λ μ΄ μ°¨μ΄λ₯Ό λνλ΄λ κ°μ ꡬν μμ€ν λ§λ€ λ€λ₯Ό μ μκ³ , μμκ° λνλ΄λ κ²½μ°κ° μκΈ° λλ¬Έμ <cstddef>μλ ptrdiff_tλΌλ μ½μΉμ ν΅ν΄μ κ·Έ λ°μ΄ν° νμ μ 곡νλ€.
aκ° nκ° μμμ λ°°μ΄μ΄λΌλ©΄, a+iκ° μ ν¨νκΈ° μν΄μλ 0<=i<=n, a+iκ° aμ μμλ₯Ό κ°λ¦¬ν€κΈ° μν νμ μΆ©λΆ μ‘°κ±΄μ, 0<=i
coordκ° coordμ 0λ²μ§Έ μμλ₯Ό κ°λ₯΄ν€λ―λ‘
coord+1 | 1λ²μ§Έ μμ |
coord+2 | 2λ²μ§Έ μμ |
coord+3 | 3λ²μ§Έ μμ. λ°°μ΄μμλ μ ν¨νμ§ μμ§λ§ ν¬μΈν° κ·Έ μ체λ‘λ μ ν¨ν ν¬μΈν°μ΄λ€. |
coord+4 | μ ν¨νμ§ μμ ν¬μΈν° |
coord-1 | -1λ²μ§Έ μμ. λ°°μ΄μμλ μ ν¨νμ§ μμ§λ§ ν¬μΈν° κ·Έ μ체λ‘λ μ ν¨ν ν¬μΈν°μ΄λ€. |
~cpp vector<double> v; copy(coords, coords + NDim, back_inserter(v));coord+NDim μ coordμ λ§μ§λ§ μμμμ 1κ°κ° λ μ§λ κ°μ κ°λ¦¬ν€λ―λ‘ μκΈ°μ ννμ μ ν¨ν ννμμ΄λ€.
p, qκ° κ°μ λ°°μ΄μ μμλ€μ ν¬μΈν°λΌλ©΄, p-qλ pμ qμ¬μ΄μ μλ μμλ€μ 거리λ₯Ό λνλ΄λ μ μκ° λλ€.
κ·Έλ¬λ μ΄ μ°¨μ΄λ₯Ό λνλ΄λ κ°μ ꡬν μμ€ν λ§λ€ λ€λ₯Ό μ μκ³ , μμκ° λνλ΄λ κ²½μ°κ° μκΈ° λλ¬Έμ <cstddef>μλ ptrdiff_tλΌλ μ½μΉμ ν΅ν΄μ κ·Έ λ°μ΄ν° νμ μ 곡νλ€.
aκ° nκ° μμμ λ°°μ΄μ΄λΌλ©΄, a+iκ° μ ν¨νκΈ° μν΄μλ 0<=i<=n, a+iκ° aμ μμλ₯Ό κ°λ¦¬ν€κΈ° μν νμ μΆ©λΆ μ‘°κ±΄μ, 0<=i
1.1.5. 10.1.5 μΈλ±μ±(Indexing) ¶
ν¬μΈν°λ μμ μ κ·Ό λ°λ³΅μμ΄λ€. λ°λΌμ vectorμ κ°μ΄ μμ μ κ·Όμ΄ λλ€.
λ§μ½ pκ° μμμ mλ²μ§Έ μμλ₯Ό κ°λ¦¬ν¨λ€λ©΄ pnμ m+nλ²μ§Έ μμλ₯Ό κ°λ¦¬ν¨λ€. (μμμ μ£Όμκ° μλλΌ μμλ₯Ό κ°λ¦¬ν¨λ€.)
λ§μ½ pκ° μμμ mλ²μ§Έ μμλ₯Ό κ°λ¦¬ν¨λ€λ©΄ pnμ m+nλ²μ§Έ μμλ₯Ό κ°λ¦¬ν¨λ€. (μμμ μ£Όμκ° μλλΌ μμλ₯Ό κ°λ¦¬ν¨λ€.)
1.1.6. 10.1.6 λ°°μ΄ μ΄κΈ°ν ¶
STLμ 컨ν
μ΄λλ€κ³Όλ λ¬λ¦¬ λ°°μ΄μ μ΄κΈ°νμ μμ΄μ λ€λ₯Έ λ¬Έλ²μ μ 곡νλ€.
μ΄ λ¬Έλ²μ μ¬μ©ν¨μΌλ‘μ¨ λ°°μ΄μ μ΄κΈ°νμμ μ¬μ©μκ° λͺ μμ μΌλ‘ λ°°μ΄μ ν¬κΈ°λ₯Ό λνλ΄μ§ μμλ λλ€.
μ΄ λ¬Έλ²μ μ¬μ©ν¨μΌλ‘μ¨ λ°°μ΄μ μ΄κΈ°νμμ μ¬μ©μκ° λͺ μμ μΌλ‘ λ°°μ΄μ ν¬κΈ°λ₯Ό λνλ΄μ§ μμλ λλ€.
~cpp const int month_length[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // μ€λ μ 무μμκΈ°μ μμ μμ month_lengthμ λ°°μ΄μ ν¬κΈ°λ₯Ό λͺ μμ μΌλ‘ λνλ΄μ§ μμλ€λ μ¬μ€μ μ μ. λμ μ μ»΄νμΌλ¬κ° μ΄κΈ°νλ κ°―μμ λ§μΆμ΄μ λ°°μ΄μ ν λΉνλ€.
1.2. 10.2 String literals revisited ¶
"hello"μ κ°μ λ¬Έμμ΄ λ¦¬ν°λ΄μ μ¬μ€μ const charνμ λ°°μ΄μ΄λ€. μ΄ λ°°μ΄μ μ€μ λ‘ μ¬μ©νλ λ¬Έμμ κ°―μλ³΄λ€ νκ°κ° λ λ§μ μμλ₯Ό ν¬ν¨νλλ°, μ΄λ λ¬Έμμ΄ λ¦¬ν°λ΄μ λμ λνλ΄λ '\0' μ¦ λ μΊλ¦ν°λ₯Ό λ£μ΄μΌνκΈ° λλ¬Έμ΄λ€.
~cpp const char hello[] = { 'h', 'e', 'l', 'l', 'o', '\0' }; //μ΄ ννμ const char hello[] = "hello";μ λμΌν ννμ΄λ€.<cstring> strlen
~cpp size_t strlen(const char* p) { // μ¬μ°λ κΈ°ν μ€λͺ μ μλ΅ size_t size = 0; while (*p++ != '\0') ++size; return size; }μκΈ°μ λ΄μ©μ λ°νμΌλ‘ stringμμ μ°λ¦¬λ λ€μκ³Ό κ°μ μ΄κΈ°νλ₯Ό ννλ κ²μ΄ κ°λ₯νλ€.
~cpp string s(hello); string s("hello"); string s(hello, hello+strlen(hello));μκΈ°μ 3κ°μ§ ννμ λͺ¨λ κ°λ€.
1.3. 10.3 Initializing arrays of character pointers ¶
~cpp //letter_grade.cpp #include <cstddef> #include <string> using std::string; string letter_grade(double grade) { // range posts for numeric grades static const double numbers[] = { 97, 94, 90, 87, 84, 80, 77, 74, 70, 60, 0 }; // names for the letter grades static const char* const letters[] = { "A+", "A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D", "F" }; // compute the number of grades given the size of the array // and the size of a single element static const size_t ngrades = sizeof(numbers)/sizeof(*numbers); // given a numeric grade, find and return the associated letter grade for (size_t i = 0; i < ngrades; ++i) { if (grade >= numbers[i]) return letters[i]; } return "?\?\?"; }
static ν€μλλ₯Ό μ¬μ©νμ¬μ λ°°μ΄μ μ΄κΈ°νμ μμλλ μκ°μ λ¨μΆνλ€.
μμ λ°°μ΄μ λ³ννμ§ μλ κ°μ΄λ―λ‘ const ν€μλ μ΄μ©
array_pointer / sizeof(*array_pointer) λ₯Ό μ΄μ©νλ©΄ arrayκ° κ°μ§κ³ μλ μμμ κ°―μλ₯Ό μ μ μλ€. μμ£Όμ°λ ννμ΄λ―λ‘ μ μ΅νλ€.
μμ λ°°μ΄μ λ³ννμ§ μλ κ°μ΄λ―λ‘ const ν€μλ μ΄μ©
array_pointer / sizeof(*array_pointer) λ₯Ό μ΄μ©νλ©΄ arrayκ° κ°μ§κ³ μλ μμμ κ°―μλ₯Ό μ μ μλ€. μμ£Όμ°λ ννμ΄λ―λ‘ μ μ΅νλ€.
1.4. 10.4 Arguments to main ¶
λλΆλΆμ μ΄μ체μ λ νλ‘κ·Έλ¨μ΄ μ€νλ λ μΈμλ‘μ λ¬Έμμ΄μ μ£Όλ κ²μ΄ κ°λ₯νλ€. μ΄κ²μ mainν¨μκ° int, char** μ 2κ°μ§μ μΈμλ₯Ό κ°μ§κΈ° λλ¬Έμ΄λ€.
κΈ°νμ λ΄μ©μ κ°λ¨νλ―λ‘ μλ΅.
~cpp #include <iostream> using std::cout; using std::endl; int main(int argc, char** argv) { // if there are command-line arguments, write them if (argc > 1) { cout << argv[1]; // write the first argument // write each remaining argument with a space before it for (int i = 2; i != argc; ++i) cout << " " << argv[i]; // `argv[i]' is a `char*' } cout << endl; return 0; }char**λ (char*)λ₯Ό μμλ‘ κ°λ λ°°μ΄μ΄λΌκ³ μκ°νλ©΄ λλ€. μ¦ λ¬Έμμ΄ λ¦¬ν°λ΄μ μμλ‘ κ°λ λ°°μ΄μ΄λ€.
κΈ°νμ λ΄μ©μ κ°λ¨νλ―λ‘ μλ΅.
1.5.1. 10.5.1 νμ€ μλ¬ μ€νΈλ¦Ό ¶
C++μμλ μΌλ°μ μΈ νμ€ μΆλ ₯ μ€νΈλ¦Ό λΏλ§μλλΌ νμ€ μλ¬ μ€νΈλ¦Όμ ν΅ν΄μ νλ‘κ·Έλ¨μ μ£Όμμ λ΄μ©λ€. μ¦ νλ‘κ·Έλ¨μ΄ μ€νλλ λμμ μνμ 보λ₯Ό μΆλ ₯νλ κ²μ΄ κ°λ₯νλ€.
λλΆλΆμ μ΄μ체μ μμλ μ΄λ° 2κ°μ§μ μΆλ ₯μ λΆλ¦¬νμ¬ μ²λ¦¬νλ λ°©λ²μ μ 곡νλ€.
β» μΆλ ₯ λ²νΌλ§μ κ΄ν λ΄μ©μ μμΈνκ² λμ¨ μ±
μ΄ λ§μΌλ―λ‘ μ°Έκ³ νλ©΄ μ’μ λ―. Cμ±
μ΄κΈ°λ νμ§λ§ ν°λ³΄ C μ 볡μ 보면 μΆλ ₯ μ€νΈλ¦Όμ λ²νΌλ§μ κ΄ν μμΈν μ€λͺ
μ΄ μλ€.
λλΆλΆμ μ΄μ체μ μμλ μ΄λ° 2κ°μ§μ μΆλ ₯μ λΆλ¦¬νμ¬ μ²λ¦¬νλ λ°©λ²μ μ 곡νλ€.
cerr | λ²νΌλ§μ μ¬μ©νμ§ μκ³ , μ¦κ°μ μΈ μΆλ ₯μ νλ€. μ€λ²ν€λκ° ν¬λ€. |
clog | λ²νΌλ§μ μ΄μ©νκ³ , μ λΉν μκΈ°μ μΆλ ₯νλ€. |
1.5.2. 10.5.2 μ¬λ¬ μ λ ₯ νμΌκ³Ό μΆλ ₯ νμΌ λ€λ£¨κΈ° ¶
νμΌμ μ
μΆλ ₯μ μν΄μ iostreamμ νμΌ μ
μΆλ ₯μ λ§λλ‘ μμμν¨ ofstream, ifstreamκ°μ²΄λ€μ μ΄μ©νλ€. μ΄λ€ ν΄λμ€λ <fstream>μ μ μ λμ΄μλ€.
<fstream>μμ μ¬μ©νλ νμΌ μ΄λ¦μ char* νμ΄λ©°, string νμ μ΄ μλλ€. μ΄λ fstream library κ° λ§λ€μ΄μ§ μκΈ°κ° STLμ΄ λ§λ€μ΄μ§ μκΈ° λ³΄λ€ μμκΈ° λλ¬Έμ΄λ€.
<fstream>μμ μ¬μ©νλ νμΌ μ΄λ¦μ char* νμ΄λ©°, string νμ μ΄ μλλ€. μ΄λ fstream library κ° λ§λ€μ΄μ§ μκΈ°κ° STLμ΄ λ§λ€μ΄μ§ μκΈ° λ³΄λ€ μμκΈ° λλ¬Έμ΄λ€.
~cpp //copy_file.cpp #include <fstream> #include <string> using std::endl; using std::getline; using std::ifstream; using std::ofstream; using std::string; int main() { ifstream infile("in"); ofstream outfile("out"); string s; while (getline(infile, s)) outfile << s << endl; return 0; }λ§μ½ νμΌμ μ΄λ¦μΌλ‘ string νμ μ΄μ©νκ³ μΆλ€λ©΄ stringνμ λ©€λ²ν¨μμΈ c_str() μ μ΄μ©ν΄μ μ¬μ©νλ κ²μ΄ κ°λ₯νλ€.
~cpp string file("out"); ifstream infile(file.c_str());
~cpp //concat_files.cpp #include <iostream> #include <fstream> #include <string> using std::cerr; using std::cout; using std::endl; using std::getline; using std::ifstream; using std::string; int main(int argc, char **argv) { int fail_count = 0; // for each file in the input list for (int i = 1; i < argc; ++i) { ifstream in(argv[i]); // if it exists, write its contents, otherwise generate an error message if (in) { string s; while (getline(in, s)) cout << s << endl; } else { cerr << "cannot open file " << argv[i] << endl; ++fail_count; } } return fail_count; }λ¨μν νλ‘κ·Έλ¨μ΄λ―λ‘ μ€λͺ μ μλ΅ν¨. νλ² μ³λ³΄μ.
1.6. 10.6 Three kinds of memory management ¶
~cpp int* invalid_pointer() { int x; return &x; //ν¨μμ μ’ λ£μ ν¨κ» xκ° ν΄μ λλ―λ‘ λ¦¬ν΄λλ κ°μ 무ν¨ν λ©λͺ¨λ¦¬μμ 곡κ°μ κ°λ¦¬ν¨λ€. }
~cpp int* pointer_to_static() { static int x; return &x; //μ ν¨νλ€. static μΌλ‘ ν¨μ μμμ μ μΈνλ©΄ ν¨μκ° μ²μ μ€νλ λ λ©λͺ¨λ¦¬ 곡κ°μ΄ νλ² ν λΉλκ³ κ·Έ ν¨ μκ° μ’ λ£λλλΌλ ν΄μ λμ§ μκ³ νλ‘κ·Έλ¨μ΄ μ’ λ£λ λ ν΄μ λλ€. λ°λΌμ λ©λͺ¨λ¦¬κ° ν΄μ λμ§ μμ static λ³μλ₯Ό 리ν΄νλ κ²μ΄κΈ°μ μ ν¨νλ€. }
μλλ©λͺ¨λ¦¬ κ΄λ¦¬ | μ§μλ³μ, μ§μλ³μλ₯Ό μ°Έμ‘°ν, ν¬μΈν°νμΌλ‘ 리ν΄νλ©΄ κ·Έ 리ν΄κ°μ 무ν¨ν κ°μ΄λλ€. μ¬μ©νκ³ μΆλ€λ©΄ static ν€μλλ₯Ό μ΄μ©ν΄μΌνλ€. |
μ μ λ©λͺ¨λ¦¬ ν λΉ | μ μ λ³μκ° μ‘΄μ¬νλ λΈλ‘μ΄ μ²μ μ€νλλ λμ ν λΉλμ΄ νλ‘κ·Έλ¨μ΄ μ€νλλ λμ κ³μ μ ν¨ν μνλ‘ λ¨λλ€. |
λμ λ©λͺ¨λ¦¬ ν λΉ | new, delete ν€μλλ₯Ό μ΄μ©ν΄μ νλ‘κ·Έλλ¨Έκ° μνλ μκΈ°μ λ©λͺ¨λ¦¬μμ ν λΉνκ³ ν΄μ λ₯Ό ν μ μλ€. |
1.6.1. 10.6.1 κ°μ²΄ ν λΉ λ° ν΄μ ¶
κ°μ²΄μ νμ
μ TλΌκ³ κ°μ₯νκ³ , λ©λͺ¨λ¦¬ μμ λμ μΌλ‘ ν λΉνκΈ° μν΄μλ
μ΄λ κ² ν λΉλ λ©λͺ¨λ¦¬ 곡κ°μ νλ‘κ·Έλλ¨Έκ° λ°λμ ν΄μ ν΄μΌν μ± μμ κ°λλ€.
~cpp new T(args)μ κ°μ ννμ μ΄μ©νλ©΄ λλ€.
μ΄λ κ² ν λΉλ λ©λͺ¨λ¦¬ 곡κ°μ νλ‘κ·Έλλ¨Έκ° λ°λμ ν΄μ ν΄μΌν μ± μμ κ°λλ€.
1.6.2. 10.6.2 λ°°μ΄ ν λΉ λ° ν΄μ ¶
κ°μ²΄μ νμ
μ T, κ°―μλ₯Ό μμ΄μλ μ μ nμ΄λΌ κ°μ₯νκ³ , λ©λͺ¨λ¦¬ μμ λμ μΌλ‘ ν λΉνκΈ° μν΄μλ
μ΄λ κ² λ°°μ΄λ‘ ν λΉλμμλ 리ν΄λλ κ°μ T* νμΌλ‘ κ·Έ λ°°μ΄μ 첫λ²μ§Έ μμμ ν¬μΈν°κ° λλ€.
λ°°μ΄μ μμλ λν΄νΈ μμ±μλ‘ μ΄κΈ°νλλ€.
μ΄λ κ² μμ±λ λ°°μ΄μ μμλ delete[] ν€μλλ‘ ν΄μ κ° κ°λ₯νλ€.
~cpp new T[n]μ κ°μ ννμ μ΄μ©νλ©΄ λλ€.
μ΄λ κ² λ°°μ΄λ‘ ν λΉλμμλ 리ν΄λλ κ°μ T* νμΌλ‘ κ·Έ λ°°μ΄μ 첫λ²μ§Έ μμμ ν¬μΈν°κ° λλ€.
λ°°μ΄μ μμλ λν΄νΈ μμ±μλ‘ μ΄κΈ°νλλ€.
μ΄λ κ² μμ±λ λ°°μ΄μ μμλ delete[] ν€μλλ‘ ν΄μ κ° κ°λ₯νλ€.
~cpp char* duplicate_chars(const char* p) { size_t length = strlen(p) + 1; char* result = new char[length]; copy(p, p+length, result); return result;κ°λ¨ν μμ€μ΄λ―λ‘ μ€λͺ μλ΅