zoukankan      html  css  js  c++  java
  • C++代码

    C++	1
    STL	83
    
     
    C++
    hello.c
    #include <iostream>
    int main (void) {
    	std::cout << "Hello, World !" << std::endl;
    	return 0;
    }
    
    hello.cpp
    #include <iostream>
    //#include <stdio.h>
    #include <cstdio>
    int main (void) {
    	std::cout << "Hello, World !" << std::endl;
    	printf ("Hello, World !
    ");
    	int i;
    	std::cin >> i;
    	std::cerr << i << std::endl;
    	std::cout << 10 << ' ' << 1.23 << ' ' << "cccc" << std::endl;
    	i = 1;
    	i = i << 2;
    	std::cout << i << std::endl;
    	return 0;
    }
    
    bool.cpp
    #include <iostream>
    using namespace std;
    int main (void) {
    	bool b = true;
    	cout << boolalpha << b << endl;
    	b = !b;
    	cout << b << endl;
    	cout << sizeof (b) << endl;
    	b = 1000;
    	cout << b << endl;
    	b = 3.14;
    	cout << b << endl;
    	b = "hello, world";
    	cout << b << endl;
    	b = NULL;
    	cout << b << endl;
    	bool male = true;
    	return 0;
    }
    string.cpp
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main (void) {
    	string s1 = "hello";
    	cout << s1 << endl;
    	s1 += " ";
    	s1 += "world";
    	cout << s1 << endl;
    	s1 = "达内科技";
    	cout << s1 << endl;
    	string s2 = "达内";
    	cout << (s1 > s2) << endl;
    	cout << s1.length () << endl;
    	string s3 = "./string.cpp";
    	FILE* fp = fopen (s3.c_str (), "r");
    	s3[2] = 'S';
    	cout << s3 << endl;
    	for (size_t i = 0; i < s3.length (); ++i)
    		cout << s3[i] << endl;
    	return 0;
    }
    
    struct.cpp
    #include <iostream>
    using namespace std;
    struct Student {
    	// 成员变量
    	char name[128];
    	int age;
    	int score;
    	// 成员函数
    	void who (void) {
    		cout << "我是" << name << ",今年"
    			<< age << "岁。今天考试得了"
    			<< score << "分。" << endl;
    	}
    };
    int main (void) {
    	Student s = {"张飞", 25, 85}, *p = &s;
    	cout << s.name << ' ' << s.age << ' '
    		<< s.score << endl;
    	cout << p->name << ' ' << p->age << ' '
    		<< p->score << endl;
    	s.who ();
    	p->who ();
    	Student t = {"赵云", 22, 45};
    	t.who ();
    	return 0;
    }
    
    union.cpp
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main (void) {
    	union {
    		int n;
    		char c[4];
    	};
    	n = 0x12345678;
    	for (int i = 0; i < 4; ++i)
    		printf ("%#x ", c[i]);
    	cout << endl;
    	return 0;
    }
    
    enum.cpp
    #include <iostream>
    using namespace std;
    enum Color {RED, GREEN, BLUE};
    void foo (int n) {}
    void bar (Color c) {}
    int main (void) {
    	cout << RED << ' ' << GREEN << ' ' << BLUE
    		<< endl;
    //	Color c = 0; // ERROR
    	Color c = RED;
    	int n = c;
    	cout << n << endl;
    	foo (RED);
    //	bar (0); // ERROR
    	return 0;
    }
    
    
    
    op.cpp
    #include <iostream>
    using namespace std;
    int main (void) <%
    	int a<::> = <%13, 21, 37, 49, 58%>;
    	int b<::> = <%79, 63, 45, 31, 16%>;
    	for (int i = 0; i < 5; ++i)
    		cout << (a<:i:> bitand b<:i:>) +
    			((a<:i:> xor b<:i:>) >> 1) << ' ';
    	cout << endl;
    %>
    
    ns.cpp
    #include <iostream>
    using namespace std;
    //int var = 9999;
    namespace ns {
    	int var = 0;
    	void fun (void) {
    		std::cout << "ns的fun函数" << std::endl;
    	}
    }
    namespace ns {
    	struct type {
    		int x;
    		char y[256];
    	};
    }
    namespace nt {
    	void fun (void) {
    		std::cout << "nt的fun函数" << std::endl;
    	}
    }
    namespace nu {
    	int x = 1234;
    	void fun (void) {
    		std::cout << "nu的fun函数" << std::endl;
    	}
    }
    int y = 8888;
    namespace nv {
    	int x = 5678;
    	int y = 9999;
    	void foo (void) {
    		cout << y << endl;
    		cout << ::y << endl;
    	}
    }
    namespace ns1 {
    	int a = 1;
    	namespace ns2 {
    		int a = 2;
    		namespace ns3 {
    			int a = 3;
    		}
    	}
    }
    int main (void) {
    	std::cout << ns::var << std::endl;
    	ns::fun ();
    	struct ns::type t = {100, "张飞"};
    	std::cout << t.x << ' ' << t.y << std::endl;
    	using namespace ns;
    	var++;
    	std::cout << var << std::endl;
    	fun ();
    	using namespace nt;
    	nt::fun ();
    	ns::fun ();
    	cout << var << endl;
    	using namespace nv;
    	using nu::x;
    	cout << "### " << x << endl;
    	nu::fun ();
    //	using nv::x;
    	nv::foo ();
    	cout << ns1::a << endl;
    	cout << ns1::ns2::a << endl;
    	cout << ns1::ns2::ns3::a << endl;
    	namespace ns123 = ns1::ns2::ns3;
    	cout << ns123::a << endl;
    	return 0;
    }
    
    
    
     
    day02
    add.c
    #include "add.h"
    int add (int a, int b) {
    	return a + b;
    }
    
    add.h
    #ifndef _ADD_H
    #define _ADD_H
    int add (int, int);
    #endif // _ADD_H
    
    main.cpp
    #include <iostream>
    using namespace std;
    extern "C" {
    #include "add.h"
    }
    int main (void) {
    	cout << add (100, 200) << endl;
    	return 0;
    }
    
    
    add.cpp
    #include "add.h"
    int add (int a, int b) {
    	return a + b;
    }
    
    add.h
    #ifndef _ADD_H
    #define _ADD_H
    #ifdef __cplusplus
    extern "C" {
    #endif
    int add (int, int);
    #ifdef __cplusplus
    }
    #endif
    #endif // _ADD_H
    
    
    main.c
    #include <stdio.h>
    #include "add.h"
    int main (void) {
    	printf ("计算结果:%d
    ", add (100, 200));
    	return 0;
    }
    
    defargs.cpp
    #include <iostream>
    using namespace std;
    void foo (int a, int b = 1000) {
    	cout << a << ' ' << b << endl;
    }
    void bar (int a = 100+900) {
    	cout << a << endl;
    }
    int b = 1000;
    void hum (int a = b) {
    	cout << a << endl;
    }
    //void fun (int a, int b = a) {} // ERROR
    void fun (int a = 1000);
    void fff (int a, int b = 1000, int c = 2000) {
    	cout << a << ' ' << b << ' ' << c << endl;
    }
    void fff (int a) {
    	cout << a << endl;
    }
    int main (void) {
    	foo (123, 456);
    	foo (123); // foo (123, 1000);
    	bar (); // bar (1000);
    	hum ();
    	fun ();
    	fff (123, 456);
    //	fff (123, , 456);
    //	fff (123); // ERROR
    	return 0;
    }
    void fun (int a /* = 1000 */) {
    	cout << a << endl;
    }
    
    dummy.cpp
    #include <iostream>
    using namespace std;
    int add (int a, int, int c) {
    	return a + c;
    }
    void foo (int) {}
    void bar (void) {}
    void bar (int) {}
    int main (void) {
    	cout << add (100, 200, 300) << endl;
    	return 0;
    }
    
    fptr.cpp
    #include <iostream>
    using namespace std;
    double foo (int n) {
    	cout << 1 << endl;
    }
    char* foo (float f) {
    	cout << 2 << endl;
    }
    int main (void) {
    	double (*p1) (int) = foo;
    	char* (*p2) (float) = foo;
    	cout << (void*)p1 << ' ' << (void*)p2 << endl;
    	p1 (3.14f); // 1
    	p2 (10); // 2
    	foo (3.14f); // 2
    	foo (10); // 1
    	return 0;
    }
    
    inline.cpp
    #include <iostream>
    using namespace std;
    inline double square (double x) {
    	return x * x;
    }
    int main (void) {
    	cout << square (3.0) << endl;
    //	cout << 3.0 * 3.0 << endl;
    	return 0;
    }
    
    match.cpp
    #include <iostream>
    using namespace std;
    void funa (char* p) {
    	cout << 1 << endl;
    }
    void funa (char const* p) {
    	cout << 2 << endl;
    }
    void funb (char const* p, char c) {
    	cout << 1 << endl;
    }
    void funb (char*p, int n) {
    	cout << 2 << endl;
    }
    void func (char c) {
    	cout << 1 << endl;
    }
    void func (int n) {
    	cout << 2 << endl;
    }
    void func (long l) {
    	cout << 3 << endl;
    }
    void fund (int n, void* p) {
    	cout << 1 << endl;
    }
    void fund (double d, ...) {
    	cout << 2 << endl;
    }
    int main (void) {
    	char* p;
    	funa (p); // 完全匹配优于常量转换
    	char c;
    	funb (p, c); // 常量转换优于升级转换
    	short h;
    	func (h); // 升级转换优于标准转换
    	          // 但也没有必要过分升级
    	double d;
    	void* pv;
    	fund (d, pv); // 可变长参数表匹配度最低
    	return 0;
    }
    
    new.cpp
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    using namespace std;
    int main (void) {
    //	int* p = (int*)malloc (sizeof (int));
    	int* p = new int;
    	*p = 1234;
    	cout << *p << endl;
    //	free (p);
    	delete p;
    	p = new int (); // 用0初始化
    	cout << *p << endl;
    	delete p;
    	p = new int (5678); // 指定初始值
    	cout << *p << endl;
    	delete p;
    	p = NULL;
    	delete p;
    //	p = (int*)malloc (5 * sizeof (int));
    	p = new int[5] {10, 20, 30, 40, 50}; // C++11
    	/*
    	for (int i = 0; i < 5; ++i)
    		p[i] = (i+1)*10;
    	*/
    	for (int i = 0; i < 5; ++i)
    		cout << p[i] << ' ';
    	cout << endl;
    	delete[] p; // !!!
    	int (*prow)[4] = new int[3][4];
    //	int *prow[4]
    	for (int i = 0; i < 3; ++i)
    		for (int j = 0; j < 4; ++j)
    			prow[i][j] = (i+1)*10+(j+1);
    	for (int i = 0; i < 3; ++i) {
    		for (int j = 0; j < 4; ++j)
    			cout << prow[i][j] << ' ';
    		cout << endl;
    	}
    	delete[] prow;
    	int (*ppage)[4][5] = new int[3][4][5];
    //	int (*ppage)[4][5] =
    //		(int (*)[4][5])malloc (60 * sizeof (int));
    	delete[] ppage;
    	try {
    		p = new int[0xFFFFFFFF];
    		// ...
    		delete[] p;
    	}
    	catch (exception& ex) {
    		cout << ex.what () << endl;
    		perror ("new");
    //		return -1;
    	}
    //	char* pool = new char[1024]; // 分配内存池
    	char pool[1024];
    	int* pn = new (pool) int (123); // 定位分配
    	char* ps = new (pool+4) char[15];
    	strcpy (ps, "Hello, World !");
    	double* pd = new (pool+19) double (3.14);
    	cout << *pn << ' ' << ps << ' ' << *pd
    		<< endl;
    //	delete[] pool; // 释放内存池
    	return 0;
    }
    
    overload.cpp
    #include <iostream>
    using namespace std;
    void foo (void) {
    	cout << "1" << endl;
    }
    void foo (int n) {
    	cout << "2" << endl;
    }
    void foo (int* n) {
    	cout << "3" << endl;
    }
    void foo (int n, double d) {
    	cout << "4" << endl;
    }
    void foo (double n, int d) {
    	cout << "5" << endl;
    }
    //void foo (double d, int n) {} // ->15
    //int foo (void) {} // ->3
    int main (void) {
    	foo (); // 1
    	foo (100); // 2
    	int n;
    	foo (&n); // 3
    	foo (n, 1.13); // 4
    	foo (1.13, n); // 5
    	return 0;
    }
    
    scope.cpp
    #include <iostream>
    using namespace std;
    void foo (void) { cout << 1 << endl; }
    namespace ns1 {
    	void foo (int a) { cout << 2 << endl; }
    	namespace ns2 {
    		void foo (int a, int b) {
    			cout << 3 << endl;
    		}
    		void bar (void) {
    			foo (10, 20);
    			ns1::foo (10);
    			::foo ();
    		}
    	}
    }
    namespace nsa {
    	void fun (int x) {
    		cout << 'a' << endl;
    	}
    }
    namespace nsb {
    	void fun (double x) {
    		cout << 'b' << endl;
    	}
    }
    int main (void) {
    	ns1::ns2::bar ();
    	using namespace nsa;
    	using namespace nsb;
    	fun (100); // a
    	fun (1.2); // b
    	using nsa::fun;
    	fun (100); // a
    	fun (1.2); // a
    	using nsb::fun;
    	fun (100); // a
    	fun (1.2); // b
    	return 0;
    }
    
     
    day03
    const.cpp
    #include <iostream>
    using namespace std;
    int main (void) {
    	int volatile const x = 100;
    	int& r = const_cast<int&> (x);
    //	char& c = const_cast<char&> (x);
    //	x = 200;
    	r = 200;
    	cout << &r << ' ' << (void*)&x << endl;
    	cout << r << endl;
    	cout << x << endl; // cout << 100 << endl;
    	return 0;
    }
    
    ref.cpp
    #include <iostream>
    using namespace std;
    int main (void) {
    	int a = 10;
    	int& b = a;
    	++b;
    	cout << a << ' ' << b << endl;
    	cout << &a << ' ' << &b << endl;
    	int& c = b;
    	++c;
    	cout << a << ' ' << b << ' ' << c << endl;
    	cout << &c << endl;
    //	int const& d = a;
    	const int& d = a;
    	cout << d << endl;
    	cout << &d << endl;
    //	d = 20;
    //	d++;
    	a = 20;
    	b++;
    	--c;
    	cout << d << endl;
    //	int& e = 10;
    	int x = 100, y = 200, z = 300;
    	cout << x + y + z << endl;
    //	x + y = z;
    	int const& e = x + y;
    	cout << e << endl;
    	int const& f = 10;
    	cout << f << endl;
    //	int& g; // ERROR
    	int& g = *new int (100);
    	cout << g << endl; // 100
    	delete &g;
    //	此时g就是一个野引用
    	return 0;
    }
    
    refarg.cpp
    #include <cmath>
    #include <cstring>
    #include <iostream>
    using namespace std;
    void foo (int a) {
    	cout << "foo:" << &a << endl;
    	++a;
    	cout << "a = " << a << endl; // 124
    }
    void bar (int& a) {
    	cout << "bar:" << &a << endl;
    	++a;
    	cout << "a = " << a << endl; // 124
    }
    double rect (double w, double h, double* c,
    	double& s) {
    	*c = (w + h) * 2;
    	s = w * h;
    	return sqrt (w * w + h * h);
    }
    struct Student {
    	char name[64];
    	char addr[256];
    	char mbox[128];
    };
    void insert (Student const& student) {
    	cout << student.name << ","
    		<< student.addr << ","
    		<< student.mbox << endl;
    //	strcpy (student.name, "sb");
    }
    int main (void) {
    	int x = 123;
    	cout << "main:" << &x << endl;
    	foo (x);
    	cout << "x = " << x << endl; // 123
    	bar (x);
    	cout << "x = " << x << endl; // 124
    	double w = 3, h = 4, c, s, t;
    	t = rect (w, h, &c, s);
    	cout << "周长:" << c << endl;
    	cout << "面积:" << s << endl;
    	cout << "对角线:" << t << endl;
    	Student student = {"张飞", "达内科技",
    		"zhangfei@tarena.com.cn"};
    	insert (student);
    	cout << student.name << endl;
    	return 0;
    }
    
    refarr.cpp
    #include <iostream>
    using namespace std;
    void foo (int a[12]) {
    	cout << sizeof (a) << endl; // 4
    }
    void bar (int a[]) {
    	cout << sizeof (a) << endl; // 4
    }
    void hum (int* a) {
    	cout << sizeof (a) << endl; // 4
    }
    void fun (int (&a)[12]) {
    	cout << sizeof (a) << endl; // 48
    }
    void fff (int (*a)[12]) {
    	cout << sizeof (*a) << endl; // 48
    }
    int main (void) {
    	int a[12];
    	cout << sizeof (a) << endl; // 48, a整体
    	foo (a); // a首地址
    	bar (a); // a首地址
    	hum (a); // a首地址
    	fun (a); // a整体
    	fff (&a);// a整体
    	return 0;
    }
    
    reffun.cpp
    #include <iostream>
    using namespace std;
    int add (int x, int y) {
    	return x + y;
    }
    int main (void) {
    	// 古典写法
    	int (*pfunc) (int, int) = &add;
    	cout << (*pfunc) (100, 200) << endl;
    	// 现代写法
    	int (*pfun2) (int, int) = add;
    	cout << pfun2 (100, 200) << endl;
    	// 函数引用
    	int (&rfunc) (int, int) = add;
    	cout << rfunc (100, 200) << endl;
    	return 0;
    }
    
    refret.cpp
    #include <iostream>
    using namespace std;
    struct A {
    	int data;
    	int& foo (void) {
    		return data;
    	}
    };
    int& bar (int& a) {
    	return a;
    }
    int& hum (void) {
    	static int n = 123;
    	return n;
    }
    int& fun (void) {
    	int m = 456;
    	return m;
    }
    int main (void) {
    	A a = {100};
    	cout << a.data << endl; // 100
    	a.foo () = 200;
    	cout << a.data << endl; // 200
    	int x;
    	bar (x) = 1000;
    	cout << x << endl; // 1000
    	int& r = hum ();
    	cout << r << endl; // 123
    	fun ();
    	cout << r << endl; // 456
    	return 0;
    }
    
    reinter.cpp
    #include <iostream>
    using namespace std;
    int main (void) {
    	char c[] = {0x78, 0x56, 0x34, 0x12};
    	int* n = reinterpret_cast<int*> (c);
    	cout << hex << showbase << *n << endl;
    	double x = 3.14;
    	double* p = &x;
    	int i = reinterpret_cast<int> (p);
    	char* h = reinterpret_cast<char*> (i);
    	p = reinterpret_cast<double*> (h);
    	cout << *p << endl;
    	return 0;
    }
    
    static.cpp
    #include <iostream>
    using namespace std;
    int main (void) {
    	short x = 10;
    	void* v = &x;
    	short* p = static_cast<short*> (v);
    //	int* q = static_cast<int*> (p);
    	return 0;
    }
    
    swap.cpp
    #include <iostream>
    using namespace std;
    void swap1 (int x, int y) {
    	int z = x;
    	x = y;
    	y = z;
    }
    void swap2 (int* x, int* y) {
    	int z = *x;
    	*x = *y;
    	*y = z;
    }
    void swap3 (int& x, int& y) {
    	int z = x;
    	x = y;
    	y = z;
    }
    void swapp (char const** x, char const** y) {
    	char const* z = *x;
    	*x = *y;
    	*y = z;
    }
    void swapr (char const*& x, char const*& y) {
    	char const* z = x;
    	x = y;
    	y = z;
    }
    int main (void) {
    	int x = 100, y = 200;
    //	swap1 (x, y);
    //	swap2 (&x, &y);
    	swap3 (x, y);
    	cout << x << ' ' << y << endl;
    	char const* p = "hello";
    	char const* q = "world";
    //	swapp (&p, &q);
    	swapr (p, q);
    	cout << p << ' ' << q << endl;
    	return 0;
    }
    
     
    day04
    cast.cpp
    #include <iostream>
    using namespace std;
    class Integer {
    public:
    	Integer (void) {
    		m_data = 0;
    	}
    	explicit Integer (int data) {
    		cout << "Integer类型转换构造函数" << endl;
    		m_data = data;
    	}
    	int m_data;
    };
    void foo (Integer const& i) {
    	cout << i.m_data << endl;
    }
    Integer bar (void) {
    	return static_cast<Integer> (400);
    }
    int main (void) {
    	Integer i;
    	cout << i.m_data << endl; // 0
    	i = static_cast<Integer> (200);
    	cout << i.m_data << endl; // 200
    	int x = 300;
    	foo (static_cast<Integer> (x));
    	cout << bar ().m_data << endl;
    	return 0;
    }
    
    constructor.cpp
    #include <iostream>
    using namespace std;
    class Student {
    public:
    	/*
    	Student (string const& name, int age) {
    		m_name = name;
    		m_age = age;
    	}
    	Student (string const& name) {
    		m_name = name;
    		m_age = 20;
    	}
    	// 缺省构造函数
    	Student (void) {
    		m_name = "";
    		m_age = 20;
    	}
    	*/
    	Student (string const& name = "", int age=20) {
    		m_name = name;
    		m_age = age;
    	}
    	void print (void) {
    		cout << m_name << "," << m_age << endl;
    	}
    private:
    	string m_name;
    	int m_age;
    };
    int main (void) {
    //	Student s1 ("张飞", 25);
    	Student s1 = Student ("张飞", 25);
    	Student s2 ("赵云");
    //	Student s3 (); // 被编译器误解为函数声明
    	Student s3;
    	s1.print ();
    	s2.print ();
    	s3.print ();
    	cout << "----------------" << endl;
    	Student* s4 = new Student ("关羽", 40);
    	Student* s5 = new Student ("刘备");
    	Student* s6 = new Student ();
    	Student* s7 = new Student;
    	s4->print ();
    	s5->print ();
    	s6->print ();
    	s7->print ();
    	delete s7;
    	delete s6;
    	delete s5;
    	delete s4;
    	cout << "----------------" << endl;
    	Student sa[3];
    	for (size_t i = 0; i < 3; ++i)
    		sa[i].print ();
    	cout << "----------------" << endl;
    	Student sc[] = {
    		Student ("曹操", 35),
    		Student ("孙权"),
    		Student ()};
    	for (size_t i = 0; i < 3; ++i)
    		(sc+i)->print ();
    	cout << "----------------" << endl;
    	Student* sd = new Student[3];
    	for (size_t i = 0; i < 3; ++i)
    		i[sd].print ();
    	delete[] sd;
    	cout << "----------------" << endl;
    	Student* se = new Student[3] {
    		Student ("黄忠", 50),
    		Student ("马超"),
    		Student ()};
    	for (size_t i = 0; i < 3; ++i)
    		se[i].print ();
    	delete[] se;
    	return 0;
    }
    
    copy.cpp
    #include <iostream>
    using namespace std;
    class Point3D {
    public:
    	Point3D (int x = 0, int y = 0, int z = 0) {
    		m_x = x;
    		m_y = y;
    		m_z = z;
    	}
    	/*
    	Point3D (Point3D const& that) {
    		cout << "Point3D拷贝构造函数" << endl;
    		m_x = that.m_x;
    		m_y = that.m_y;
    		m_z = that.m_z;
    	}
    	*/
    	void print (void) {
    		cout << "三维点(" << m_x << ',' << m_y
    			<< ',' << m_z << ')' << endl;
    	}
    private:
    	int m_x;
    	int m_y;
    	int m_z;
    };
    void foo (Point3D p) {
    	p.print ();
    }
    Point3D bar (void) {
    	Point3D p (40, 50, 60);
    	cout << "bar:" << &p << endl;
    	return p;
    }
    int main (void) {
    	Point3D p1 (10, 20, 30);
    	p1.print ();
    	Point3D p2 = p1;
    	p2.print ();
    	foo (p2);
    	Point3D const& p = bar ();
    	cout << "main:" << &p << endl;
    	return 0;
    }
    
    defcon.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	A (void) {
    		cout << "A的缺省构造函数" << endl;
    		m_data = 0;
    	}
    	A (int data) {
    		cout << "A的有参构造函数" << endl;
    		m_data = data;
    	}
    	int m_data;
    };
    class B {
    public:
    	B (int i = 0) {
    		m_i = i;
    	}
    	int m_i; // 基本类型成员
    	A   m_a; // 类类型成员
    };
    int main (void) {
    	B b;
    	cout << b.m_i << endl;
    	return 0;
    }
    
    
    init.cpp
    #include <iostream>
    using namespace std;
    class Student {
    public:
    	Student (string const& name = "",
    		int age = 20) : m_name (name), m_age (age) {
    	}
    	void print (void) {
    		cout << m_name << "," << m_age << endl;
    	}
    private:
    	string m_name;
    	int m_age;
    };
    class A {
    public:
    	A (int data) : m_data (data) {}
    	int m_data;
    };
    class B {
    public:
    	B (int data) : m_a (data) {}
    	A m_a;
    };
    int g_x = 5678;
    class C {
    public:
    	C (void) : m_i (1000), m_r (g_x) {}
    	int const m_i;
    	int& m_r;
    };
    class D {
    public:
    	D (string const& str) : m_str (str),
    		m_len (str.length ()) {}
    	int m_len;
    	string m_str;
    };
    struct Date {
    	int year;
    	int mon;
    	int day;
    };
    class E {
    public:
    	E (int a[], Date d) : m_a {a[0], a[1], a[2]},
    	  /*m_d {d.year, d.mon, d.day}*/
    	  m_d (d) {}
    	int m_a[3];
    	Date m_d;
    };
    int main (void) {
    	Student s1 ("张飞", 25);
    	Student s2 ("赵云");
    	Student s3;
    	s1.print ();
    	s2.print ();
    	s3.print ();
    	B b (1234);
    	cout << b.m_a.m_data << endl;
    	C c;
    	cout << c.m_i << ' ' << c.m_r << endl;
    	D d ("ABCDEFG");
    	cout << d.m_len << ' ' << d.m_str << endl;
    	int a[3] = {123, 456, 789};
    	Date dt = {2015, 1, 8};
    	E e (a, dt);
    	cout << e.m_a[0] << ' ' << e.m_a[1] << ' '
    		<< e.m_a[2] << endl;
    	cout << e.m_d.year << '-' << e.m_d.mon << '-'
    		<< e.m_d.day << endl;
    	return 0;
    }
    
    student.cpp
    #include <iostream>
    using namespace std;
    class Student {
    public:
    	// 构造函数
    	Student (string const& name, int age, int no) {
    		cout << "我出生了!呵呵!" << endl;
    		m_name = name;
    		m_age = age;
    		m_no = no;
    	}
    	void eat (string const& food) {
    		cout << "我叫" << m_name << ",正在吃"
    			<< food << endl;
    	}
    	void sleep (int time) {
    		cout << "我今年" << m_age << "岁,睡了"
    			<< time << "小时" << endl;
    	}
    	void learn (string const& course) {
    		cout << "我的学号是" << m_no << ",现在学"
    			<< course << "课" << endl;
    	}
    	void setName (string const& name) {
    		if (name == "二")
    			cout << "拒绝接受不雅的姓名!" << endl;
    		else
    			m_name = name;
    	}
    	void setAge (int age) {
    		if (age < 0)
    			cout << "拒绝接受非法的年龄!" << endl;
    		else
    			m_age = age;
    	}
    	void setNo (int no) {
    		if (no < 0 || 10000 < no)
    			cout << "拒绝接受错误的学号!" << endl;
    		else
    			m_no = no;
    	}
    private:
    	string m_name;
    	int m_age;
    	int m_no;
    };
    int main (void) {
    	Student s1 ("张飞", 25, 1001);
    	s1.setName ("二");
    	s1.setAge (-1);
    	s1.setNo (1001000);
    	s1.eat ("面条");
    	s1.sleep (1);
    	s1.learn ("C++");
    	Student* s2 = new Student ("赵云", 20, 1002);
    	s2->eat ("烙饼");
    	s2->sleep (2);
    	s2->learn ("UNIX-C");
    	delete s2;
    	return 0;
    }
    
    
    student.h
    #ifndef _STUDENT_H
    #define _STUDENT_H
    #include <string>
    using namespace std;
    // 声明学生类
    class Student {
    public:
    	// 构造函数
    	Student (string const& name, int age, int no);
    	void eat (string const& food);
    	void sleep (int time);
    	void learn (string const& course);
    	void setName (string const& name);
    	void setAge (int age);
    	void setNo (int no);
    private:
    	string m_name;
    	int m_age;
    	int m_no;
    };
    #endif // _STUDENT_H
    
    
    
    student.cpp
    // 实现学生类
    #include <iostream>
    using namespace std;
    #include "student.h"
    // 构造函数
    Student::Student (string const& name, int age,
    	int no) {
    	cout << "我出生了!呵呵!" << endl;
    	m_name = name;
    	m_age = age;
    	m_no = no;
    }
    void Student::eat (string const& food) {
    	cout << "我叫" << m_name << ",正在吃"
    		<< food << endl;
    }
    void Student::sleep (int time) {
    	cout << "我今年" << m_age << "岁,睡了"
    		<< time << "小时" << endl;
    }
    void Student::learn (string const& course) {
    	cout << "我的学号是" << m_no << ",现在学"
    		<< course << "课" << endl;
    }
    void Student::setName (string const& name) {
    	if (name == "二")
    		cout << "拒绝接受不雅的姓名!" << endl;
    	else
    		m_name = name;
    }
    void Student::setAge (int age) {
    	if (age < 0)
    		cout << "拒绝接受非法的年龄!" << endl;
    	else
    		m_age = age;
    }
    void Student::setNo (int no) {
    	if (no < 0 || 10000 < no)
    		cout << "拒绝接受错误的学号!" << endl;
    	else
    		m_no = no;
    }
    
    main.cpp
    #include "student.h"
    int main (void) {
    	Student s1 ("张飞", 25, 1001);
    	s1.setName ("二");
    	s1.setAge (-1);
    	s1.setNo (1001000);
    	s1.eat ("面条");
    	s1.sleep (1);
    	s1.learn ("C++");
    	Student* s2 = new Student ("赵云", 20, 1002);
    	s2->eat ("烙饼");
    	s2->sleep (2);
    	s2->learn ("UNIX-C");
    	delete s2;
    	return 0;
    }
    
     
    day05
    array.cpp
    #include <iostream>
    using namespace std;
    class Array {
    public:
    	Array (size_t size) : m_array (new int[size]),
    		m_size (size) {
    		cout << "构造函数:" << this << endl;
    	}
    	~Array (void) {
    		cout << "析构函数:" << this << endl;
    		delete[] m_array;
    	}
    	int& at (size_t i) {
    		if (i >= m_size)
    			throw string ("下标溢出!");
    		return m_array[i];
    	}
    	int const& at (size_t i) const {
    		return const_cast<Array*> (this)->at (i);
    	}
    private:
    	int* m_array;
    	size_t m_size;
    };
    Array g_a (3);
    int main (void) {
    	cout << "main函数开始了!" << endl;
    	{
    		Array a (5);
    		for (size_t i = 0; i < 5; ++i)
    			a.at (i) = i + 1;
    		for (size_t i = 0; i < 5; ++i)
    			cout << a.at (i) << ' ';
    		cout << endl;
    	}
    	cout << "再见喽!" << endl;
    	Array* a = new Array (10);
    //	a = malloc (sizeof (Array));
    //	Array::Array (a);
    	// ...
    	delete a;
    //	Array::~Array (a);
    //	free (a);
    	return 0;
    }
    
    cfunc.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	void foo (void) {} // 非常函数
    //	void foo (A* this) {}
    	void bar (void) const {} // 常函数
    //	void bar (A const* this) {}
    	void hum (void) {
    //	void hum (A* this) {
    		cout << "hum函数的非常版本" << endl;
    	}
    	void hum (void) const {
    //	void hum (A const* this) {
    		cout << "hum函数的常版本" << endl;
    	}
    	void fun (void) const {
    		cout << "fun函数的常版本" << endl;
    	}
    };
    int main (void) {
    	A a; // 非常对象
    	a.foo (); // foo (&a)
    	a.bar (); // bar (&a)
    	A const& r = a; // 常对象
    //	r.foo (); // foo (&r)
    	r.bar (); // bar (&r)
    	A const* p = &a; // 常对象
    //	p->foo (); // foo (p)
    	p->bar (); // bar (p)
    	a.hum (); // hum (&a);
    	r.hum (); // hum (&r);
    	p->hum (); // hum (p);
    	a.fun ();
    	r.fun ();
    	p->fun ();
    	return 0;
    }
    
    const.cpp
    #include <iostream>
    using namespace std;
    class Student {
    public:
    	Student (string const& name = "", int age = 0) :
    		m_name (name), m_age (age), m_times (0) {}
    	// 常函数
    	void print (void) const {
    //	void print (Student const* this) {
    		cout << m_name << "," << m_age << endl;
    //		this->m_name = "sb";
    //		this->m_age = -1;
    //		++const_cast<Student*> (this)->m_times;
    		++m_times;
    	}
    	string m_name;
    	int m_age;
    	mutable int m_times;
    };
    void print (Student const& student) {
    	cout << student.m_name << ","
    		<< student.m_age << endl;
    //	student.m_name = "sb";
    //	student.m_age = -1;
    }
    int main (void) {
    	Student student ("张飞", 25);
    	print (student);
    	print (student);
    	student.print ();
    	student.print ();
    	cout << student.m_times << endl;
    	return 0;
    }
    
    cp.cpp
    #include <iostream>
    using namespace std;
    class Integer {
    public:
    	Integer (int i) : m_i (new int (i)) {}
    	/* 缺省的支持浅拷贝的拷贝构造函数
    	Integer (Integer const& that) :
    		m_i (that.m_i) {}
    	*/
    	// 自定义支持深拷贝的拷贝构造函数
    	Integer (Integer const& that) :
    		m_i (new int (*that.m_i)) {}
    	~Integer (void) {
    		if (m_i) {
    			delete m_i;
    			m_i = NULL;
    		}
    	}
    	/* 缺省的支持浅拷贝的拷贝赋值运算符函数
    	Integer& operator= (Integer const& rhs) {
    		cout << "拷贝赋值运算符函数" << endl;
    		m_i = rhs.m_i;
    	}
    	*/
    	// 自定义支持深拷贝的拷贝赋值运算符函数
    	Integer& operator= (Integer const& rhs) {
    		if (&rhs != this) { // 防止自赋值
    			int* i = new int (*rhs.m_i);
    			delete m_i; // 释放旧资源
    			m_i = i;
    			// 分配新资源
    			// 拷贝新内容
    		}
    		return *this; // 返回自引用
    	}
    	int* m_i;
    };
    int main (void) {
    	Integer i1 (100);
    	cout << *i1.m_i << endl;
    	Integer i2 = i1; // 拷贝构造
    	cout << *i2.m_i << endl;
    	*i1.m_i = 200;
    	cout << *i2.m_i << endl;
    	Integer i3 (300);
    	i1 = i3; // 拷贝赋值
    //	i1.operator= (i3); // 拷贝赋值运算符函数
    	cout << *i1.m_i << endl; // 300
    	cout << *i3.m_i << endl; // 300
    	*i3.m_i = 400;
    	cout << *i1.m_i << endl; // 300
    	cout << *i3.m_i << endl; // 400
    	cout << i1.m_i << ' ' << i3.m_i << endl;
    	int x = 10, y = 20, z = 30;
    	(x = y) = z;
    	cout << x << ' ' << y << ' ' << z << endl;
    	// 30 20 30
    	(i1 = i2) = i3;
    //	i1.operator= (i2).operator= (i3)
    	i1 = i1;
    	return 0;
    }
    
    defdes.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	A (void) {
    		cout << "A构造" << endl;
    	}
    	~A (void) {
    		cout << "A析构" << endl;
    	}
    };
    class B {
    private:
    	A m_a;
    };
    class C {
    public:
    	C (void) : m_a (new A) {}
    	~C (void) {
    		delete m_a;
    	}
    private:
    	A* m_a;
    };
    int main (void) {
    //	B b;
    	C c;
    	return 0;
    }
    
    
    object.cpp
    #include <cstring>
    #include <iostream>
    using namespace std;
    class Student {
    public:
    	Student (char const* name, int age) :
    //	Student (Student* this, char const* name,
    //		int age)
    		m_age (age) {
    		cout << "构造函数中的this:" << this
    			<< endl;
    		strcpy (m_name, name);
    	}
    	void print (void) {
    		cout << "this:" << this << endl;
    		cout << m_name << "," << m_age << endl;
    	}
    	/*
    	void print (Student* this) {
    		cout << this->m_name << "," <<
    			this->m_age << endl;
    	}
    	*/
    private:
    	char m_name[256];
    	int m_age;
    };
    int main (void) {
    	Student s1 ("张飞", 25);
    	// s1.Student (&s1, "张飞", 25);
    	cout << "&s1:" << &s1 << endl;
    	s1.print (); // s1.print (&s1);
    	cout << sizeof (s1) << endl;
    	Student s2 ("赵云", 20);
    	cout << "&s2:" << &s2 << endl;
    	s2.print (); // s2.print (&s2);
    	return 0;
    }
    
    question.cpp
    #include <iostream>
    using namespace std;
    class Student;
    class Teacher {
    public:
    	void educate (Student* student);
    	void reply (char const* answer) {
    		m_answer = answer;
    	}
    private:
    	string m_answer;
    };
    class Student {
    public:
    	void ask (char const* question,
    		Teacher* teacher) {
    		cout << "问题:" << question << endl;
    		teacher->reply ("我不知道!");
    	}
    };
    void Teacher::educate (Student* student) {
    	student->ask ("什么是this指针?", this);
    	cout << "回答:" << m_answer << endl;
    }
    class A {
    public:
    	A (void) {
    		cout << "我出生了!" << endl;
    	}
    	~A (void) {
    		cout << "我要死了!" << endl;
    	}
    	void work (void) {
    		cout << "我工作了..." << endl;
    		delete this; // 自我毁灭
    	}
    };
    int main (void) {
    	Teacher t;
    	Student s;
    	t.educate (&s);
    	(new A)->work ();
    	return 0;
    }
    
    string.cpp
    #include <cstring>
    #include <iostream>
    using namespace std;
    class String {
    public:
    	String (char const* str = NULL) :
    		m_str (strcpy (
    			new char [strlen (str ? str : "") + 1],
    			str ? str : "")) {}
    	String (String const& that) :
    		m_str (strcpy (
    			new char [strlen (that.m_str) + 1],
    			that.m_str)) {}
    	~String (void) {
    		if (m_str) {
    			delete[] m_str;
    			m_str = NULL;
    		}
    	}
    	String& operator= (String const& rhs) {
    	}
    	char const* c_str (void) const {
    		return m_str;
    	}
    private:
    	char* m_str;
    };
    int main (void) {
    	String s1 ("hello");
    	cout << s1.c_str () << endl;
    	String s2 = s1;
    	cout << s2.c_str () << endl;
    	String s3 ("world");
    	s2 = s3;
    	cout << s2.c_str () << endl;
    	return 0;
    }
    
    this.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	A (int* data, int numb) : numb (numb) {
    		for (int i = 0; i < numb; ++i)
    			this->data[i] = data[i];
    //		this->numb = numb;
    	}
    	int data[1024];
    	int numb;
    };
    class B {
    public:
    	B (void) : m_counter (0) {}
    	B& inc (void) {
    		++m_counter;
    		return *this; // 返回自引用
    	}
    	int m_counter;
    };
    int main (void) {
    	int data[5] = {10, 20, 30, 40, 50};
    	A a (data, 5);
    	for (int i = 0; i < a.numb; ++i)
    		cout << a.data[i] << ' ';
    	cout << endl;
    	B b;
    	b.inc ().inc ().inc ();
    	cout << b.m_counter << endl; // 3
    	return 0;
    }
    
     
    day06
    account.cpp
    #include <iostream>
    using namespace std;
    class Account {
    public:
    	Account (double balance) :
    		m_balance (balance) {}
    	double settle (void) {
    		return m_balance *= (1 + m_inter);
    	}
    	static void setInter (double inter) {
    		m_inter = inter;
    	}
    private:
    	double m_balance;
    	static double m_inter;
    };
    double Account::m_inter = 0.01;
    int main (void) {
    	Account a1 (1000), a2 (10000);
    	cout << a1.settle () << ' '
    		<< a2.settle () << endl;
    	Account::setInter (0.05);
    	cout << a1.settle () << ' '
    		<< a2.settle () << endl;
    	return 0;
    }
    
    complex1.cpp
    #include <iostream>
    using namespace std;
    class Complex {
    public:
    	Complex (int r = 0, int i = 0) :
    		m_r (r), m_i (i) {}
    	void show (void) const {
    		cout << m_r << '+' << m_i << 'i' << endl;
    	}
    	// 第一个const:返回常对象,禁止对返回值赋值
    	// 第二个const:支持常对象形式的右操作数
    	// 第三个const:支持常对象形式的左操作数
    	Complex const operator+ (
    		Complex const& rhs) const {
    		return Complex (m_r + rhs.m_r,
    			m_i + rhs.m_i);
    	}
    private:
    	int m_r;
    	int m_i;
    	friend Complex const operator- (
    		Complex const&, Complex const&);
    };
    Complex const operator- (Complex const& lhs,
    	Complex const& rhs) {
    	return Complex (lhs.m_r - rhs.m_r,
    		lhs.m_i - rhs.m_i);
    }
    int main (void) {
    	Complex c1 (1, 2), c2 (3, 4), c3 (5, 6);
    	c1.show ();
    	c2.show ();
    	c3.show ();
    //	Complex c4 = c1.operator+ (c2).operator+ (c3);
    	Complex c4 = c1 + c2 + c3;
    	c4.show ();
    	/*
    	int a, b, c;
    	(a + b) = c;
    	*/
    //	(c1 + c2) = c3;
    	Complex const c5 (7, 8);
    	(c1 + c5).show (); // c1.operator+ (c5)
    	(c5 + c1).show (); // c5.operator+ (c1)
    	c4 = c3 - c2;
    //	c4 = ::operator- (c3, c2);
    	c4.show ();
    	return 0;
    }
    
    complex2.cpp
    #include <iostream>
    using namespace std;
    class Complex {
    public:
    	Complex (int r = 0, int i = 0) :
    		m_r (r), m_i (i) {}
    	void show (void) const {
    		cout << m_r << '+' << m_i << 'i' << endl;
    	}
    	Complex& operator+= (Complex const& rhs) {
    		m_r += rhs.m_r;
    		m_i += rhs.m_i;
    		return *this;
    	}
    	friend Complex& operator-= (Complex& lhs,
    		Complex const& rhs) {
    		lhs.m_r -= rhs.m_r;
    		lhs.m_i -= rhs.m_i;
    		return lhs;
    	}
    private:
    	int m_r;
    	int m_i;
    };
    int main (void) {
    	Complex c1 (1, 2), c2 (3, 4), c3 (5, 6);
    	c1 += c2; // c1.operator+= (c2)
    	c1.show (); // 4+6i
    	(c1 += c2) += c3;
    	c1.show (); // 12+16i
    	/*
    	int a = 1, b = 3, c = 5;
    	(a += b) += c;
    	cout << a << endl; // 9
    	*/
    	c1 -= c3;
    	c1.show (); // 7+10i
    	return 0;
    }
    
    complex3.cpp
    #include <cmath>
    #include <iostream>
    using namespace std;
    class Complex {
    public:
    	Complex (int r = 0, int i = 0) :
    		m_r (r), m_i (i) {}
    	Complex const operator- () const {
    		return Complex (-m_r, -m_i);
    	}
    	friend int operator~ (Complex const& opd) {
    		return sqrt (opd.m_r * opd.m_r +
    			opd.m_i * opd.m_i);
    	}
    	friend istream& operator>> (istream& lhs,
    		Complex& rhs) {
    		return lhs >> rhs.m_r >> rhs.m_i;
    	}
    	friend ostream& operator<< (ostream& lhs,
    		Complex const& rhs) {
    		return lhs << rhs.m_r << '+' << rhs.m_i
    			<< 'i';
    	}
    private:
    	int m_r, m_i;
    };
    int main (void) {
    	Complex c1, c2;
    	cin >> c1 >> c2;
    //	::operator>> (::operator>> (cin, c1), c2);
    	cout << c1 << ' ' << c2 << endl;
    //	::operator<< (
    //		::operator<< (
    //			::operator<< (
    //				::operator<< (cout, c1), ' '), c2),
    //					endl);
    	cout << -c1 << endl;
    	cout << ~c2 << endl;
    	return 0;
    }
    complex4.cpp
    #include <iostream>
    using namespace std;
    class Complex {
    public:
    	Complex (int r = 0, int i = 0) :
    		m_r (r), m_i (i) {}
    	void show (void) const {
    		cout << m_r << '+' << m_i << 'i' << endl;
    	}
    	// 成员函数形式的前++
    	Complex& operator++ (void) {
    		++m_r;
    		++m_i;
    		return *this;
    	}
    	// 全局函数形式的前--
    	friend Complex& operator-- (Complex& opd) {
    		--opd.m_r;
    		--opd.m_i;
    		return opd;
    	}
    	// 成员函数形式的后++
    	Complex const operator++ (int) {
    		Complex old = *this;
    		++*this;
    		return old;
    	}
    	// 全局函数形式的后--
    	friend Complex const operator-- (Complex& opd,
    		int) {
    		Complex old = opd;
    		--opd;
    		return old;
    	}
    	friend ostream& operator<< (ostream& lhs,
    		Complex const& rhs) {
    		return lhs << rhs.m_r << '+' << rhs.m_i
    			<< 'i';
    	}
    private:
    	int m_r, m_i;
    };
    int main (void) {
    	int x = 10;
    	++x = 20;
    	cout << x << endl; // 20
    	++++++++x; // ++(++(++(++x)))
    	cout << x << endl; // 24
    	cout << ++x << endl; // 25
    	cout << x << endl; // 25
    	Complex c1 (1, 2), c2 (30, 40);
    	cout << ++c1 << endl; // 2+3i
    //	cout << c1.operator++ () << endl;
    	cout << c1 << endl; // 2+3i
    	++c1 = c2;
    	cout << c1 << endl; // 30+40i
    	++++++++c1;
    	cout << c1 << endl; // 34+44i
    	cout << --c1 << endl; // 33+43i
    	cout << c1 << endl; // 33+43i
    	------c1;
    	cout << c1 << endl; // 30+40i
    //	x++ = 30;
    //	x++++++++;
    	cout << c1++ << endl; // 30+40i
    //	cout << c1.operator++ (0) << endl;
    	cout << c1 << endl; // 31+41i
    	cout << c1-- << endl; // 31+41i
    	cout << c1 << endl; // 30+40i
    	return 0;
    }
    
    membptr.cpp
    #include <cstring>
    #include <iostream>
    using namespace std;
    class Student {
    public:
    	Student (string const& name = "", int age = 0) :
    		m_name (name), m_age (age) {}
    	void who (void) const {
    		cout << m_name << "," << m_age << endl;
    	}
    	bool m_sex;
    	double m_score;
    	string m_name;
    	int m_age;
    };
    int main (void) {
    	string Student::*pname = &Student::m_name;
    	int Student::*page = &Student::m_age;
    	Student s ("张飞", 25), *p = &s;
    	// .* - 成员指针解引用运算符
    	cout << s.*pname << "," << s.*page << endl;
    	// ->* - 间接成员指针解引用运算符
    	cout << p->*pname << "," << p->*page << endl;
    	int i;
    	memcpy (&i, &pname, 4);
    	cout << i << endl;
    	memcpy (&i, &page, 4);
    	cout << i << endl;
    	void (Student::*pwho) (void) const =
    		&Student::who;
    	memcpy (&i, &pwho, 4);
    	cout << hex << showbase << i << endl;
    	(s.*pwho) ();
    	(p->*pwho) ();
    	return 0;
    }
    
    others.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	int& operator[] (int i) {
    		return m_array[i];
    	}
    	int const& operator[] (int i) const {
    		return const_cast<A&> (*this)[i];
    	}
    private:
    	int m_array[10];
    };
    class B {
    public:
    	int operator() (int x, int y) const {
    		return x + y;
    	}
    };
    class Integer {
    public:
    	Integer (int i = 0) : m_i (i) {}
    	operator int (void) const {
    		return m_i;
    	}
    	int m_i;
    };
    int main (void) {
    	A a;
    	a[0] = 1; // a.operator[] (0) = 1
    	a[1] = 2; // a.operator[] (1) = 2
    	cout << a[0] << ' ' << a[1] << endl;
    	A const& cr = a;
    	cout << cr[0] << endl;
    //	cr[0]++;
    	B b;
    	cout << b (123, 456) << endl;
    //	cout << b.operator() (123, 456) << endl;
    	Integer x;
    	x = 123;
    	cout << x.m_i << endl;
    	int y;
    	y = x;
    	cout << y << endl;
    	return 0;
    }
    
    single.cpp
    #include <iostream>
    using namespace std;
    // 单例模式
    class A {
    public:
    	void work (void) {
    		cout << "使用对象的功能..." << endl;
    	}
    	static A& getInstance (void) {
    //		return m_a;
    		if (! m_a)
    			m_a = new A;
    		return *m_a;
    	}
    private:
    	A (void) {};
    	A (const A&) {};
    //	static A m_a;
    	static A* m_a;
    };
    //A A::m_a;
    A* A::m_a = NULL;
    /*
    A g_a;
    A g_b;
    A g_c;
    */
    int main (void) {
    	A& a = A::getInstance ();
    	a.work ();
    	A& b = A::getInstance ();
    	b.work ();
    	cout << &a << ' ' << &b << endl;
    	return 0;
    }
    
    static.cpp
    #include <iostream>
    using namespace std;
    static int g = 100; // 静态全局变量
    static void foo (void) { // 静态全局函数
    	static int i = 10; // 静态局部变量
    	int j = 10;
    	cout << ++i << ' ' << ++j << endl;
    }
    class A {
    public:
    	A (void) : m_memb (300) {}
    	static int m_smemb; // 静态成员变量
    	int m_memb;
    	static void foo (void) { // 静态成员函数
    		cout << m_smemb << endl;
    //		cout << m_memb << endl; // 错误
    //		cout << this << endl; // 错误
    //		bar (); // 错误
    	}
    	void bar (void) {
    		cout << m_memb << endl;
    		cout << m_smemb << endl;
    		foo ();
    	}
    private:
    	static int m_spriv;
    	static int const m_i = 10; // 只有常静态成员变量
    	                           // 才能在类的声明部分
    	                           // 初始化
    };
    int A::m_smemb = 200; // 定义静态成员变量
    int A::m_spriv = 400;
    int main (void) {
    	foo (); // 11 11
    	foo (); // 12 11
    	foo (); // 13 11
    	A a1, a2;
    	cout << &a1.m_smemb << ' ' << &a1.m_memb<<endl;
    	cout << &a2.m_smemb << ' ' << &a2.m_memb<<endl;
    	++a1.m_smemb;
    	cout << a2.m_smemb << endl; // 201
    	++a1.m_memb;
    	cout << a2.m_memb << endl; // 300
    	cout << A::m_smemb << endl; // 201
    //	cout << A::m_memb << endl; // 错误
    //	cout << a1.m_spriv << endl;// 私有无法访问
    //	cout << A::m_spriv << endl;
    	return 0;
    }
    
    string.cpp
    #include <cstring>
    #include <iostream>
    using namespace std;
    class String {
    public:
    	String (char const* str = NULL) :
    		m_str (strcpy (
    			new char [strlen (str ? str : "") + 1],
    			str ? str : "")) {}
    	String (String const& that) :
    		m_str (strcpy (
    			new char [strlen (that.m_str) + 1],
    			that.m_str)) {}
    	~String (void) {
    		if (m_str) {
    			delete[] m_str;
    			m_str = NULL;
    		}
    	}
    	/* 菜鸟
    	void operator= (String const& rhs) {
    		m_str = new char[strlen (rhs.m_str) + 1];
    		strcpy (m_str, rhs.m_str);
    	}*/
    	/* 小鸟
    	String& operator= (String const& rhs) {
    		if (&rhs != this) {
    			delete[] m_str;
    			m_str = strcpy (
    				new char[strlen (rhs.m_str) + 1],
    				rhs.m_str);
    		}
    		return *this;
    	}*/
    	/* 大鸟
    	String& operator= (String const& rhs) {
    		if (&rhs != this) {
    			char* str =
    				new char[strlen (rhs.m_str) + 1];
    			delete[] m_str;
    			m_str = strcpy (str, rhs.m_str);
    		}
    		return *this;
    	}*/
    	// 老鸟
    	String& operator= (String const& rhs) {
    		if (&rhs != this) {
    			String str (rhs);
    			swap (m_str, str.m_str);
    		}
    		return *this;
    	}
    	char const* c_str (void) const {
    		return m_str;
    	}
    private:
    	char* m_str;
    };
    int main (void) {
    	String s1 ("hello");
    	cout << s1.c_str () << endl;
    	String s2 = s1;
    	cout << s2.c_str () << endl;
    	String s3 ("world");
    	s2 = s3;
    	cout << s2.c_str () << endl;
    	return 0;
    }
    
     
    day07
    abc.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	A (void) : m_x (0) {
    		cout << "A缺省构造" << endl;
    	}
    	A (int x) : m_x (x) {
    		cout << "A有参构造" << endl;
    	}
    	A (A const& that) : m_x (that.m_x) {
    		cout << "A拷贝构造" << endl;
    	}
    	A& operator= (A const& rhs) {
    		cout << "A拷贝赋值" << endl;
    		m_x = rhs.m_x;
    		return *this;
    	}
    	~A (void) {
    		cout << "A析构函数" << endl;
    	}
    	friend ostream& operator<< (ostream& lhs,
    		A const& rhs) {
    		return lhs << rhs.m_x;
    	}
    private:
    	int m_x;
    };
    class B : public A {
    public:
    	B (void) : /*A (), */m_y (0) {
    		cout << "B缺省构造" << endl;
    	}
    	B (int x, int y) : A (x), m_y (y) {
    		cout << "B有参构造" << endl;
    	}
    	B (B const& that) : A (that), m_y (that.m_y) {
    		cout << "B拷贝构造" << endl;
    	}
    	B& operator= (B const& rhs) {
    		cout << "B拷贝赋值" << endl;
    		A::operator= (rhs);
    		m_y = rhs.m_y;
    		return *this;
    	}
    	~B (void) {
    		cout << "B析构函数" << endl;
    	}
    	friend ostream& operator<< (ostream& lhs,
    		B const& rhs) {
    		return lhs << static_cast<A const&> (rhs)
    			<< '+' << rhs.m_y << 'i';
    	}
    private:
    	int m_y;
    };
    int main (void) {
    	cout << "-------- 1 --------" << endl;
    	B b1 (100, 200);
    	cout << "-------- 2 --------" << endl;
    	B b2 = b1;
    	cout << "-------- 3 --------" << endl;
    	B b3;
    	b3 = b2;
    	cout << "-------- 4 --------" << endl;
    	cout << b3 << endl;
    	cout << "-------- 5 --------" << endl;
    	A* p = new B;
    	delete p; // A::~A
    	cout << "-------- 6 --------" << endl;
    	return 0;
    }
    
    access.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	int m_pub;
    	void pub (void) { cout << "pub" << endl; }
    protected:
    	int m_pro;
    	void pro (void) { cout << "pro" << endl;
    		m_pri = 100;
    		cout << m_pri << endl;
    	}
    private:
    	int m_pri;
    	void pri (void) { cout << "pri" << endl; }
    };
    class B : public A {
    public:
    	void foo (void) {
    		m_pub = 0;
    		pub ();
    		m_pro = 0;
    		pro ();
    //		m_pri = 0;
    //		pri ();
    	}
    };
    int main (void) {
    	B b;
    	b.m_pub = 1;
    	b.pub ();
    //	b.m_pro = 1;
    //	b.pro ();
    //	b.m_pri = 1;
    //	b.pri ();
    	cout << sizeof (b) << endl;
    	b.foo ();
    	return 0;
    }
    
    diamond.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	A (int data) : m_data (data) {}
    protected:
    	int m_data;
    };
    class B : virtual public A {
    public:
    	B (int data) : A (data) {}
    	void set (int data) {
    		m_data = data;
    	}
    };
    class C : virtual public A {
    public:
    	C (int data) : A (data) {}
    	int get (void) {
    		return m_data;
    	}
    };
    class D : public B, public C {
    public:
    	D (int data) : B (-9), C (23), A (data) {}
    };
    int main (void) {
    	D d (1000);
    	cout << d.get () << endl;
    	d.set (2000);
    	cout << d.get () << endl;
    	cout << sizeof (D) << endl; // 12
    	cout << sizeof (B) << endl; // 
    	cout << sizeof (C) << endl; // 
    	cout << sizeof (A) << endl; // 
    	return 0;
    }
    
    hide.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	void foo (void) {
    		cout << "A::foo" << endl;
    	}
    	void bar (void) {}
    	int hum;
    };
    class B : public A {
    public:
    	using A::foo;
    	void foo (int x) {
    		cout << "B::foo" << endl;
    		A::hum = 10;
    	}
    	int bar;
    	typedef unsigned int hum;
    };
    int main (void) {
    	B b;
    //	b.A::foo ();
    	b.foo ();
    	b.foo (100);
    	b.A::bar ();
    	b.A::hum = 10;
    	return 0;
    }
    
    hst.cpp
    #include <iostream>
    using namespace std;
    // 人类
    class Human {
    public:
    	Human (string const& name = "", int age = 0) :
    		m_name (name), m_age (age) {}
    	void eat (string const& food) const {
    		cout << m_name << "吃" << food << endl;
    	}
    	void sleep (int hours) const {
    		cout << m_name << "睡" << hours << "小时"
    			<< endl;
    	}
    	void old (void) const {
    		cout << "我今年" << m_age << "岁" << endl;
    	}
    protected:
    	string m_name;
    	int m_age;
    };
    // 学生类
    class Student : public Human {
    public:
    	Student (string const& name, int age, int no) :
    		Human (name, age), m_no (no) {}
    	void learn (string const& course) const {
    		cout << "我的学号" << m_no << ",正在学习"
    			<< course << endl;
    	}
    private:
    	int m_no;
    };
    // 教师类
    class Teacher : public Human {
    public:
    	Teacher (string const& name, int age,
    		double salary) : Human (name, age),
    		m_salary (salary) {}
    	void teach (string const& course) const {
    		cout << "我的工资" << m_salary
    			<< ",正在讲授" << course << endl;
    	}
    private:
    	double m_salary;
    };
    int main (void) {
    	Student s1 ("张飞", 25, 1001);
    	s1.eat ("包子");
    	s1.sleep (5);
    	s1.old ();
    	s1.learn ("C++");
    	cout << sizeof (s1) << endl;
    	Teacher t1 ("曹操", 60, 50000);
    	t1.eat ("煎饼");
    	t1.sleep (2);
    	t1.old ();
    	t1.teach ("标C");
    	cout << sizeof (t1) << endl;
    	Human* h = &s1; // 向上造型安全,皆然性
    	h->eat ("KFC");
    	h->sleep (10);
    	h->old ();
    //	h->learn ("UNIX");
    	Student* s = static_cast<Student*> (h);
    	s->learn ("UNIX");
    	Human h1 ("刘备", 40);
    	s = static_cast<Student*> (&h1);
    	s->learn ("Win32");
    	return 0;
    }
    
    pointer.cpp
    #include <iostream>
    using namespace std;
    class B {
    public:
    	B (void) : m_data (1234) {}
    	void foo (void) {
    		cout << "B::foo" << endl;
    	}
    	string operator() (string const& x = "我在吃", 
    		string const& y = "好吃的") const {
    		return x + y;
    	}
    	int m_data;
    };
    class A {
    public:
    	A (B* b) : m_b (b) {}
    	B* operator-> (void) const {
    		return m_b;
    	}
    	B& operator* (void) const {
    		return *m_b;
    	}
    private:
    	B* m_b;
    };
    int main (void) {
    	B b;
    	A a (&b);
    	cout << a->m_data << endl;
    //	cout << a.operator->()->m_data << endl;
    	a->foo ();
    //	a.operator->()->foo ();
    	cout << (*a).m_data << endl;
    //	cout << a.operator*().m_data << endl;
    	(*a).foo ();
    //	a.operator*().foo ();
    	cout << b ("我在学习", "标准C++编程") << endl;
    //	cout << b.operator() (
    //		"我在学习", "标准C++编程") << endl;
    	cout << b () << endl;
    	return 0;
    }
    
    sp.cpp
    #include <iostream>
    using namespace std;
    class Phone {
    public:
    	Phone (string const& no) : m_no (no) {}
    	void call (string const& no) const {
    		cout << m_no << "打电话给" << no << endl;
    	}
    	int m_a;
    	int foo (int x, int y) const {
    		return x + y;
    	}
    private:
    	string m_no;
    };
    class Player {
    public:
    	Player (string const& media) :
    		m_media (media) {}
    	void play (string const& clip) const {
    		cout << m_media << "播放器播放" << clip
    			<< endl;
    	}
    	typedef int m_a;
    	int foo (int x, int y, int z) const {
    		return x + y + z;
    	}
    private:
    	string m_media;
    };
    class Computer {
    public:
    	Computer (string const& os) : m_os (os) {}
    	void run (string const& app) const {
    		cout << "在" << m_os << "系统上运行"
    			<< app << endl;
    	}
    	void m_a (void) {}
    private:
    	string m_os;
    };
    class SmartPhone : public Phone, public Player,
    	public Computer {
    public:
    	SmartPhone (string const& no,
    		string const& media, string const os) :
    		Phone (no), Player (media), Computer (os) {}
    	int m_a;
    	using Phone::foo;
    	using Player::foo;
    };
    int main (void) {
    	SmartPhone sp ("13910110072", "MP4", "iOS");
    	sp.call ("01062332018");
    	sp.play ("小苹果");
    	sp.run ("LOL");
    	Phone* phone = &sp;
    //	Player* player = reinterpret_cast<Player*>(&sp);
    	Player* player = &sp;
    	Computer* computer = &sp;
    	cout << &sp << ' ' << phone << ' ' << player
    		<< ' ' << computer << endl;
    	phone->call ("01062332018");
    	player->play ("小苹果");
    	computer->run ("LOL");
    	SmartPhone* psp =
    		static_cast<SmartPhone*> (player);
    	cout << psp << endl;
    	psp = static_cast<SmartPhone*> (computer);
    	cout << psp << endl;
    	sp.Phone::m_a = 20;
    	SmartPhone::Player::m_a i;
    	sp.m_a = 10;
    	sp.Computer::m_a ();
    //	cout << sp.Phone::foo (100, 200) << endl;
    //	cout << sp.Player::foo (100, 200, 300) << endl;
    	cout << sp.foo (100, 200) << endl;
    	cout << sp.foo (100, 200, 300) << endl;
    	return 0;
    }
    
    xyz.cpp
    #include <iostream>
    using namespace std;
    class X {
    public:
    	int m_pub;
    protected:
    	int m_pro;
    private:
    	int m_pri;
    };
    class Y1 : public X { // 公子
    };
    class Z1 : public Y1 {
    public:
    	void foo (void) {
    		m_pub = 0;
    		m_pro = 0;
    //		m_pri = 0;
    	}
    };
    class Y2 : protected X { // 保子
    };
    class Z2 : public Y2 {
    public:
    	void foo (void) {
    		m_pub = 0;
    		m_pro = 0;
    //		m_pri = 0;
    	}
    };
    class Y3 : private X { // 私子
    };
    class Z3 : public Y3 {
    public:
    	void foo (void) {
    //		m_pub = 0;
    //		m_pro = 0;
    //		m_pri = 0;
    	}
    };
    int main (void) {
    	Y1 y1;
    	y1.m_pub = 0;
    //	y1.m_pro = 0;
    //	y1.m_pri = 0;
    	Y2 y2;
    //	y2.m_pub = 0;
    //	y2.m_pro = 0;
    //	y2.m_pri = 0;
    	Y3 y3;
    //	y3.m_pub = 0;
    //	y3.m_pro = 0;
    //	y3.m_pri = 0;
    	X* x = &y1;
    //	x = &y2;
    //	x = &y3;
    	return 0;
    }
    
     
    day08
    dao.cpp
    #include <iostream>
    using namespace std;
    class Employee {
    public:
    	string m_name;
    	int m_no;
    	int m_age;
    	// ...
    };
    class Dao {
    public:
    	virtual void insert (
    		Employee const& emp) const = 0;
    };
    class OracleDao : public Dao {
    public:
    	void insert (Employee const& emp) const {
    		cout << "向Oracle数据库插入记录" << endl;
    	}
    };
    class SQLServerDao : public Dao {
    public:
    	void insert (Employee const& emp) const {
    		cout << "向SQLServer数据库插入记录" << endl;
    	}
    };
    void business (Dao const& dao) {
    	// 通过Pro*C向Oracle数据库插入一条记录
    	// 通过ODBC向SQLServer数据库插入一条记录
    	Employee emp;
    	// ...
    	dao.insert (emp); // 面向抽象编程
    }
    int main (void) {
    //	business (OracleDao ());
    	business (SQLServerDao ());
    	return 0;
    }
    
    dc.cpp
    #include <iostream>
    #include <stdexcept>
    using namespace std;
    class A {
    public:
    	virtual void foo (void) {}
    };
    class B : public A {};
    class C : public B {};
    class D {};
    int main (void) {
    	B b;
    	A* pa = &b;
    	cout << "pa = " << pa << endl;
    	// pa实际指向B类对象,转换成功
    	B* pb = dynamic_cast<B*> (pa);
    	cout << "pb = " << pb << endl;
    	// pa没有指向C类对象,转换失败,安全
    	C* pc = dynamic_cast<C*> (pa);
    	cout << "pc = " << pc << endl;
    	try {
    		A& ra = b;
    		C& rc = dynamic_cast<C&> (ra);
    	}
    	catch (exception& ex) {
    		cout << "转换失败:" << ex.what () << endl;
    	}
    	// pa没有指向D类对象,转换失败,安全
    	D* pd = dynamic_cast<D*> (pa);
    	cout << "pd = " << pd << endl;
    	// B是A的子类,转换成功
    	pb = static_cast<B*> (pa);
    	cout << "pb = " << pb << endl;
    	// C是A的间接子类,转换成功,危险
    	pc = static_cast<C*> (pa);
    	cout << "pc = " << pc << endl;
    	// D与A没有亲缘关系,转换失败,安全
    //	pd = static_cast<D*> (pa);
    //	cout << "pd = " << pd << endl;
    	// 编译期、运行期都不检查,永远成功,危险
    	pb = reinterpret_cast<B*> (pa);
    	cout << "pb = " << pb << endl;
    	pc = reinterpret_cast<C*> (pa);
    	cout << "pc = " << pc << endl;
    	pd = reinterpret_cast<D*> (pa);
    	cout << "pd = " << pd << endl;
    	return 0;
    }
    
    override.cpp
    #include <iostream>
    using namespace std;
    /* 全局函数不能是虚函数
    virtual void foo (void) {}
    */
    class A {
    public:
    	/* 静态成员函数不能是虚函数
    	virtual static void foo (void) {}
    	*/
    	void foo (void) {
    		cout << "A::foo" << endl;
    	}
    };
    class B : public A {
    public:
    	virtual void foo (void) { // 隐藏A::foo
    		cout << "B::foo" << endl;
    	}
    };
    class C : public B {
    public:
    	void foo (void) { // 覆盖B::foo
    		cout << "C::foo" << endl;
    	}
    };
    class D : public C {
    public:
    	void foo (void) { // 覆盖C::foo
    		cout << "D::foo" << endl;
    	}
    };
    class E {
    public:
    	virtual void foo (void) {}
    };
    class F : public E {
    public:
    	virtual void bar (void) {} // 函数名不一致
    	virtual void foo (int x) {} // 形参表不一致
    	virtual void foo (void) const {} // 常属性不一致
    	void foo (void) {} // 覆盖E::foo
    };
    class X {};
    class Y : public X {};
    class Z {};
    class G {
    public:
    	virtual void foo (void) {}
    	virtual int bar (void) {}
    	virtual X hum (void) {}
    	virtual /*Y**/X* fun (void) {}
    };
    class H : public G {
    public:
    	/*int*/void foo (void) {}
    	/*long*/int bar (void) {};
    	/*Y*/X hum (void) {}
    	/*Z**//*X**/Y* fun (void) {}
    };
    class I {
    public:
    	virtual void foo (void) {
    		cout << "I::foo" << endl;
    	}
    };
    class J : public I {
    private:
    	void foo (void) { // 覆盖I::foo
    		cout << "J::foo" << endl;
    	}
    };
    int main (void) {
    	B b;
    	A& a = b;
    	a.foo ();
    	C c;
    	B& rb = c;
    	rb.foo ();
    	D d;
    	B* pb = &d;
    	pb->foo ();
    	J j;
    //	j.foo ();
    	I& i = j;
    	i.foo ();
    	return 0;
    }
    
    parser.cpp
    #include <iostream>
    using namespace std;
    class Text {};
    class Rect {};
    class Image {};
    class Parser {
    public:
    	void parse (char const* filename) {
    		// 解析出文本
    		Text text;
    		showText (text);
    		// 解析出矩形
    		Rect rect;
    		showRect (rect);
    		// 解析出图像
    		Image image;
    		showImage (image);
    		// ...
    	}
    private:
    	virtual void showText (Text const&) = 0;
    	virtual void showRect (Rect const&) = 0;
    	virtual void showImage (Image const&) = 0;
    	// ...
    };
    class RenderForWindows : public Parser {
    private:
    	void showText (Text const& text) {
    		cout << "显示文本" << endl;
    	}
    	void showRect (Rect const& rect) {
    		cout << "显示矩形" << endl;
    	}
    	void showImage (Image const& image) {
    		cout << "显示图像" << endl;
    	}
    	// ...
    };
    /*
    class RenderForMac : public Parser { ... };
    */
    int main (void) {
    	RenderForWindows render;
    //	RenderForMac render;
    	render.parse ("xxx.pdf");
    	return 0;
    }
    
    poly.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	A (void) {
    		/*this->*/foo (); // A::foo
    	}
    	~A (void) {
    		/*this->*/foo (); // A::foo
    	} 
    	virtual void foo (void) {
    		cout << "A::foo" << endl;
    	}
    	void bar (void) {
    		/*this->*/foo (); // B::foo
    	}
    };
    class B : public A {
    public:
    	void foo (void) {
    		cout << "B::foo" << endl;
    	}
    };
    int main (void) {
    	B b;
    //	A a = b;
    	A& a = b;
    	a.foo ();
    	b.bar ();
    	return 0;
    }
    
    shape.cpp
    #include <iostream>
    using namespace std;
    class Shape { // 抽象类
    public:
    	Shape (int x, int y) : m_x (x), m_y (y) {}
    	/*
    	virtual void draw (void) const {
    		cout << "图形(" << m_x << ',' << m_y << ')'
    			<< endl;
    	}
    	*/
    	// 纯虚函数
    	virtual void draw (void) const = 0;
    protected:
    	int m_x;
    	int m_y;
    };
    class Rect : public Shape {
    public:
    	Rect (int x, int y, int w, int h) :
    		Shape (x, y), m_w (w), m_h (h) {}
    	void draw (void) const {
    		cout << "矩形(" << m_x << ',' << m_y << ','
    			<< m_w << ',' << m_h << ')' << endl;
    	}
    private:
    	int m_w;
    	int m_h;
    };
    class Circle : public Shape {
    public:
    	Circle (int x, int y, int r) :
    		Shape (x, y), m_r (r) {}
    	void draw (void) const {
    		cout << "圆形(" << m_x << ',' << m_y << ','
    			<< m_r << ')' << endl;
    	}
    private:
    	int m_r;
    };
    class Triangle : public Shape {
    public:
    	void foo (void) {}
    };
    void render (Shape* shapes[]) {
    	for (size_t i = 0; shapes[i]; ++i)
    		shapes[i]->draw ();
    }
    int main (void) {
    	Shape* shapes[1024] = {};
    	shapes[0] = new Rect (1, 2, 3, 4);
    	shapes[1] = new Circle (5, 6, 7);
    	shapes[2] = new Circle (8, 9, 10);
    	shapes[3] = new Rect (11, 12, 13, 14);
    	shapes[4] = new Rect (15, 16, 17, 18);
    	render (shapes);
    //	Shape shape (1, 2);
    //	Triangle* pt = new Triangle;
    	return 0;
    }
    
    type.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	int foo (int x, int y) {
    //		m_data = 10;
    		return x + y;
    	}
    	int m_data;
    };
    class B : public A {
    public:
    	int m_memb;
    };
    int main (void) {
    	A* p = NULL;
    	cout << p->foo (100, 200) << endl;
    	B b;
    	p = &b;
    	cout << (p->m_data = 100) << endl;
    	A a;
    	B* pb = static_cast<B*> (&a);
    	cout << (pb->m_memb = 200) << endl;
    	return 0;
    }
    
    typeid.cpp
    #include <iostream>
    #include <typeinfo>
    #include <cstring>
    using namespace std;
    class XYZ {};
    class A { virtual void foo (void) {} };
    class B : public A {};
    void bar (A* pa) {
    //	if (! strcmp (typeid (*pa).name (), "1A"))
    	if (typeid (*pa) == typeid (A))
    		cout << "传入的是个A对象" << endl;
    	else
    //	if (! strcmp (typeid (*pa).name (), "1B"))
    	if (typeid (*pa) == typeid (B))
    		cout << "传入的是个B对象" << endl;
    	else
    		cout << "传入的是个怪物" << endl;
    }
    int main (void) {
    	cout << typeid (char).name () << endl;
    	cout << typeid (unsigned char).name () << endl;
    	cout << typeid (short).name () << endl;
    	cout << typeid (unsigned short).name () << endl;
    	cout << typeid (int).name () << endl;
    	cout << typeid (unsigned int).name () << endl;
    	cout << typeid (long).name () << endl;
    	cout << typeid (unsigned long).name () << endl;
    	cout << typeid (long long).name () << endl;
    	cout << typeid (unsigned long long).name ()
    		<< endl;
    	cout << typeid (float).name () << endl;
    	cout << typeid (double).name () << endl;
    	cout << typeid (long double).name () << endl;
    	cout << typeid (int*****).name () << endl;
    	cout << typeid (const char*).name () << endl;
    	cout << typeid (char const*).name () << endl;
    	cout << typeid (char *const).name () << endl;
    	cout << typeid (float[10]).name () << endl;
    	cout << typeid (float[10][5]).name () << endl;
    	cout << typeid (int* (*) (int*)).name ()
    		<< endl;
    	cout << typeid (int* (*[10]) (int*)).name ()
    		<< endl;
    	cout << typeid (XYZ).name () << endl;
    	B b;
    	A* pa = &b;
    	cout << typeid (*pa).name () << endl;
    	A a;
    	bar (&a);
    	bar (&b);
    	return 0;
    }
    
    vdes.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	A (void) { cout << "A构造" << endl; }
    	virtual ~A (void) { cout << "A析构" << endl; }
    };
    class B : public A {
    public:
    	B (void) { cout << "B构造" << endl; }
    	~B (void) { cout << "B析构" << endl; }
    };
    int main (void) {
    //	B* p = new B;
    	A* p = new B;
    	// ...
    	delete p;
    	return 0;
    };
    
    vtbl.cpp
    #include <iostream>
    using namespace std;
    typedef void (*VFUN) (void*);
    typedef VFUN* VPTR;
    class A {
    public:
    	A (int data) : m_data (data) {}
    	virtual void foo (void) {
    		cout << "A::foo:" << m_data << endl;
    	}
    	virtual void bar (void) {
    		cout << "A::bar:" << m_data << endl;
    	}
    protected:
    	int m_data;
    };
    class B : public A {
    public:
    	B (int data) : A (data) {}
    	void foo (void) {
    		cout << "B::foo:" << m_data << endl;
    	}
    };
    int main (void) {
    	A a (100);
    	a.foo ();
    	a.bar ();
    	B b (200);
    	b.foo ();
    	b.bar ();
    	A& r = b;
    	r.foo ();
    	r.bar ();
    	cout << "----------------" << endl;
    	VPTR vptr = *(VPTR*)&a;
    	cout << (void*)vptr[0] << ' '
    		<< (void*)vptr[1] << endl;
    	vptr[0] (&a);
    	vptr[1] (&a);
    	vptr = *(VPTR*)&b;
    	cout << (void*)vptr[0] << ' '
    		<< (void*)vptr[1] << endl;
    	vptr[0] (&b);
    	vptr[1] (&b);
    	return 0;
    }
     
    day09
    consex.cpp
    #include <cstdio>
    #include <iostream>
    using namespace std;
    class A {
    public:
    	A (size_t size) : m_data (new int[size]) {
    		FILE* fp = fopen ("none", "r");
    		if (! fp) {
    			cout << "释放内存资源" << endl;
    			delete[] m_data;
    			throw -1;
    		}
    		// ...
    		fclose (fp);
    	}
    	~A (void) {
    		if (m_data) {
    			cout << "释放内存资源" << endl;
    			delete[] m_data;
    			m_data = NULL;
    		}
    	}
    private:
    	int* m_data;
    };
    int main (void) {
    	try {
    		A a (1024);
    		// ...
    	}
    	catch (int& ex) {
    		cout << ex << endl;
    		return -1;
    	}
    	return 0;
    }
    
    copy.cpp
    #include <cstdio>
    #include <iostream>
    #include <fstream>
    using namespace std;
    int main (int argc, char* argv[]) {
    	if (argc < 3) {
    		cout << "用法:" << argv[0]
    			<< " <源文件> <目的文件>" << endl;
    		return -1;
    	}
    	ifstream ifs (argv[1], ios::binary);
    	if (! ifs) {
    		perror ("打开源文件失败");
    		return -1;
    	}
    	ofstream ofs (argv[2], ios::binary);
    	if (! ofs) {
    		perror ("打开目的文件失败");
    		return -1;
    	}
    	char buf[1024];
    	while (ifs.read (buf, 1024))
    		ofs.write (buf, 1024);
    	if (ifs.eof ())
    		ofs.write (buf, ifs.gcount ());
    	else
    		perror ("读取源文件失败");
    	ofs.close ();
    	ifs.close ();
    	return 0;
    }
    
    except.cpp
    #include <cstdlib>
    #include <cstdio>
    #include <errno.h>
    #include <cstring>
    #include <iostream>
    using namespace std;
    class CalcException {
    public:
    	CalcException (string const& msg,
    		string const& file, string const& func,
    		int no) : m_msg (msg), m_file (file),
    		m_func (func), m_no (no) {}
    	friend ostream& operator<< (ostream& os,
    		CalcException const& ex) {
    		return os << ex.m_msg << ":"
    			<< ex.m_file << ","
    			<< ex.m_func << ","
    			<< ex.m_no;
    	}
    private:
    	string m_msg;
    	string m_file;
    	string m_func;
    	int m_no;
    };
    void foo (void) {
    	// ...
    	cout << "要分配内存..." << endl;
    	void* p = malloc (/*0xFFFFFFFF*/1);
    	if (! p)
    		throw 17;
    	cout << "分配内存成功!" << endl;
    	// ...
    	free (p);
    	FILE* fp = fopen ("none", "r");
    	if (! fp)
    		throw string (strerror (errno));
    	// ...
    	fclose (fp);
    	if (0) {
    		throw CalcException ("计算错误", __FILE__,
    			__FUNCTION__, __LINE__);
    	}
    	if (1)
    		throw 3.14;
    }
    void bar (void) {
    	cout << "调用foo之前..." << endl;
    	foo ();
    	cout << "调用foo之后..." << endl;
    }
    void hum (void) {
    	try {
    		cout << "调用bar之前..." << endl;
    		bar ();
    		cout << "调用bar之后..." << endl;
    	}
    	catch (double& ex) {
    		cout << ex << endl;
    		throw;
    	}
    }
    int main (void) {
    	try {
    		cout << "调用hum之前..." << endl;
    		hum ();
    		cout << "调用hum之后..." << endl;
    	}
    	catch (int& ex) {
    		cout << "出错啦:" << ex << endl;
    		return -1;
    	}
    	catch (string& ex) {
    		cout << "失败啦:" << ex << endl;
    		return -1;
    	}
    	catch (CalcException& ex) {
    		cout << ex << endl;
    		return -1;
    	}
    	catch (...) {
    		cout << "其它异常!" << endl;
    		return -1;
    	}
    	return 0;
    };
    
    format.cpp
    #include <cmath>
    #include <iostream>
    #include <iomanip>
    #include <fstream>
    using namespace std;
    int main (void) {
    	cout << sqrt (200) << endl;
    	cout.precision (10);
    	cout << sqrt (200) << endl;
    	cout.setf (ios::scientific);
    	cout << sqrt (200) << endl;
    	cout << setprecision (8) << sqrt (200) << endl;
    	cout << oct << 127 << endl;
    	cout << hex << 127 << endl;
    	cout << dec << 127 << endl;
    	cout << '[' << setw (10) << 256 << ']' << endl;
    	cout << '[' << setw (10) << left << 256 << ']'
    		<< endl;
    	cout << '[' << setfill ('_') << setw (10)
    		<< 256 << ']' << endl;
    	cout << '[' << setw (10) << 345 << ']'
    		<< '[' << 678 << ']' << endl;
    	ifstream ifs ("i.txt");
    	ifs.unsetf (ios::skipws);
    	char c;
    	while (ifs >> c)
    		cout << c;
    	cout << endl;
    	ifs.close ();
    	return 0;
    }
    
    seek.cpp
    #include <iostream>
    #include <fstream>
    using namespace std;
    int main (void) {
    	fstream fs ("seek.txt", ios::in | ios::out);
    	fs << "0123456789";
    	fs.seekp (-7, ios::cur);
    	cout << "当前位置:" << fs.tellp () << endl;
    	cout << "当前位置:" << fs.tellg () << endl;
    	fs << "ABCD";
    	fs.seekg (ios::beg);
    	cout << "当前位置:" << fs.tellg () << endl;
    	cout << "当前位置:" << fs.tellp () << endl;
    //	fs.seekg (0, ios::beg);
    	int i;
    	fs >> i;
    	cout << i << endl; // 12
    	return 0;
    }
    
    stdexcept.cpp
    #include <errno.h>
    #include <cstring>
    #include <cstdio>
    #include <iostream>
    #include <stdexcept>
    using namespace std;
    class FileException : public exception {
    public:
    	FileException (void) :
    		m_msg (strerror (errno)) {}
    	const char* what (void) const throw () {
    		return m_msg.c_str ();
    	}
    	~FileException (void) throw () {}
    private:
    	string m_msg;
    };
    void foo (void) {
    	char* p = new char[/*0xFFFFFFFF*/1];
    	FILE* fp = fopen ("none", "r");
    	if (! fp) {
    		delete[] p;
    		throw FileException ();
    	}
    	// ...
    	fclose (fp);
    	delete[] p;
    }
    int main (void) {
    	try {
    		foo ();
    	}
    	catch (bad_alloc& ex) {
    		cout << "处理内存分配失败..." << endl;
    		return -1;
    	}
    	catch (FileException& ex) {
    		cout << "处理文件访问失败..." << endl;
    		return -1;
    	}
    	catch (exception& ex) {
    		cout << "系统错误,请联系系统管理员..."
    			<< endl;
    		cout << ex.what () << endl;
    		return -1;
    	}
    	catch (...) {
    	}
    	return 0;
    }
    
    text.cpp
    #include <cstdio>
    #include <iostream>
    #include <fstream>
    using namespace std;
    int main (void) {
    	ofstream ofs ("text.txt");
    	if (! ofs)
    		perror ("打开文件失败");
    	ofs << 1234 << ' ' << 56.78 << ' '
    		<< "apples" << endl;
    	ofs.close ();
    	ofs.open ("text.txt", ios::app);
    	if (! ofs)
    		perror ("打开文件失败");
    	ofs << "append_a_line" << endl;
    	ofs.close ();
    	ifstream ifs ("text.txt");
    	if (! ifs)
    		perror ("打开文件失败");
    	int i;
    	double d;
    	string s1, s2;
    	ifs >> i >> d >> s1 >> s2;
    	cout << i << endl;
    	cout << d << endl;
    	cout << s1 << endl;
    	cout << s2 << endl;
    	ifs.close ();
    	return 0;
    }
    
    throw.cpp
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    void foo (int a) throw (float, int,double,string);
    //void foo (int a) throw (int, double, string) {
    void foo (int a) throw (int,double,float,string){
    //void foo (int a) throw () {
    //void foo (int a) {
    	if (a == 1)
    		throw 1;
    	else if (a == 2)
    		throw 3.14;
    	else if (a == 3)
    		throw string ("Hello, World !");
    	else
    		throw 3.14f;
    }
    int main (int argc, char* argv[]) {
    	try {
    		foo (atoi (argv[1]));
    	}
    	catch (int& ex) {
    		cout << ex << endl;
    	}
    	catch (double& ex) {
    		cout << ex << endl;
    	}
    	catch (string& ex) {
    		cout << ex << endl;
    	}
    	catch (float& ex) {
    		cout << ex << endl;
    	}
    	catch (...) {
    		cout << "其它异常!" << endl;
    	}
    	return 0;
    }
    
    vtbl.cpp
    #include <iostream>
    using namespace std;
    typedef void (*VFUN) (void*);
    typedef VFUN* VPTR;
    class A {
    public:
    	A (int data) : m_data (data) {
    		cout << "A构造" << endl;
    		VPTR vptr = *(VPTR*)this;
    		cout << vptr << "->" << (void*)vptr[0]
    			<< ',' << (void*)vptr[1] << endl;
    	}
    	~A (void) {
    		cout << "A析构" << endl;
    		VPTR vptr = *(VPTR*)this;
    		cout << vptr << "->" << (void*)vptr[0]
    			<< ',' << (void*)vptr[1] << endl;
    	}
    	virtual void foo (void) {
    		cout << "A::foo:" << m_data << endl;
    	}
    	virtual void bar (void) {
    		cout << "A::bar:" << m_data << endl;
    	}
    protected:
    	int m_data;
    };
    class B : public A {
    public:
    	B (int data) : A (data) {
    		cout << "B构造" << endl;
    		VPTR vptr = *(VPTR*)this;
    		cout << vptr << "->" << (void*)vptr[0]
    			<< ',' << (void*)vptr[1] << endl;
    	}
    	~B (void) {
    		cout << "B析构" << endl;
    		VPTR vptr = *(VPTR*)this;
    		cout << vptr << "->" << (void*)vptr[0]
    			<< ',' << (void*)vptr[1] << endl;
    	}
    	void foo (void) {
    		cout << "B::foo:" << m_data << endl;
    	}
    };
    int main (void) {
    	A a (100);
    	a.foo ();
    	a.bar ();
    	B b (200);
    	b.foo ();
    	b.bar ();
    	A& r = b;
    	r.foo ();
    	r.bar ();
    	cout << "----------------" << endl;
    	VPTR vptr = *(VPTR*)&a;
    	cout << "A之虚表指针:" << vptr << endl;
    	cout << (void*)vptr[0] << ' '
    		<< (void*)vptr[1] << endl;
    	vptr[0] (&a);
    	vptr[1] (&a);
    	vptr = *(VPTR*)&b;
    	cout << "B之虚表指针:" << vptr << endl;
    	cout << (void*)vptr[0] << ' '
    		<< (void*)vptr[1] << endl;
    	vptr[0] (&b);
    	vptr[1] (&b);
    	return 0;
    }
    
     
    STL
    day01
    array.cpp
    #include <iostream>
    using namespace std;
    template<typename T>
    class Array {
    public:
    	T& operator[] (size_t i) {
    		return m_array[i];
    	}
    	T const& operator[] (size_t i) const {
    		return const_cast<Array<T>&> (*this) [i];
    	}
    private:
    	T m_array[3];
    };
    int main (void) {
    	Array<int> a1;
    	a1[0] = 13;
    	a1[1] = 27;
    	a1[2] = 39;
    	for (size_t i = 0; i < 3; ++i)
    		cout << a1[i] << ' ';
    	cout << endl;
    	Array<double> a2;
    	a2[0] = 1.26;
    	a2[1] = 2.35;
    	a2[2] = 3.14;
    	for (size_t i = 0; i < 3; ++i)
    		cout << a2[i] << ' ';
    	cout << endl;
    	Array<string> a3;
    	a3[0] = "北京";
    	a3[1] = "上海";
    	a3[2] = "广州";
    	for (size_t i = 0; i < 3; ++i)
    		cout << a3[i] << ' ';
    	cout << endl;
    	Array<Array<int> > a4;
    	for (size_t i = 0; i < 3; ++i)
    		for (size_t j = 0; j < 3; ++j)
    			a4[i][j] = (i+1)*10+j+1;
    //			a4.operator[](i).operator[](j) = ..;
    	for (size_t i = 0; i < 3; ++i) {
    		for (size_t j = 0; j < 3; ++j)
    			cout << a4[i][j] << ' ';
    		cout << endl;
    	}
    	Array<Array<Array<int> > > a5;
    	return 0;
    }
    
    ctmpl.cpp
    #include <iostream>
    using namespace std;
    // 类模板
    /*
    template<typename T>
    class Comparator {
    public:
    	Comparator (T x, T y) : m_x (x), m_y (y) {}
    	T max (void) const {
    		return m_x < m_y ? m_y : m_x;
    	}
    	T min (void) const {
    		return m_x < m_y ? m_x : m_y;
    	}
    private:
    	T m_x;
    	T m_y;
    };
    */
    template<typename T>
    class Comparator {
    public:
    	Comparator (T x, T y);
    	Comparator (Comparator<T> const& that);
    	T max (void) const;
    	T min (void) const;
    	bool equal (void) const;
    private:
    	T m_x;
    	T m_y;
    };
    template<typename T>
    Comparator<T>::Comparator (T x, T y) :
    	m_x (x), m_y (y) {}
    template<typename T>
    Comparator<T>::Comparator (
    	Comparator<T> const& that) :
    	m_x (that.m_x), m_y (that.m_y) {}
    template<typename T>
    T Comparator<T>::max (void) const {
    	return m_x < m_y ? m_y : m_x;
    }
    template<typename T>
    T Comparator<T>::min (void) const {
    	return m_x < m_y ? m_x : m_y;
    }
    template<typename T>
    bool Comparator<T>::equal (void) const {
    	return m_x == m_y;
    }
    class Integer {
    public:
    	Integer (int data = 0) : m_data (data) {}
    	friend ostream& operator<< (ostream& os,
    		Integer const& integer) {
    		return os << integer.m_data;
    	}
    	bool operator< (Integer const& rhs) const {
    		return m_data < rhs.m_data;
    	}
    private:
    	int m_data;
    };
    int main (void) {
    	Comparator<int> c1 (123, 456);
    	cout << c1.max () << ' ' << c1.min () << endl;
    	Comparator<double> c2 (1.23, 4.56);
    	cout << c2.max () << ' ' << c2.min () << endl;
    	Comparator<string> c3 ("hello", "world");
    	cout << c3.max () << ' ' << c3.min () << endl;
    	Comparator<string> c4 = c3;
    	cout << c4.max () << ' ' << c4.min () << endl;
    	Integer i1 (123), i2 (456);
    	Comparator<Integer> c5 (i1, i2);
    	cout << c5.max () << ' ' << c5.min () << endl;
    //	cout << c5.equal () << endl;
    	return 0;
    }
    
    ftmpl.cpp
    #include <iostream>
    using namespace std;
    // 函数模板
    template<typename T>
    T max (T x, T y) {
    	return x < y ? y : x;
    }
    int main (void) {
    //	cout << ::max<int> (123, 456) << endl;
    	cout << ::max (123, 456) << endl;
    //	cout << ::max<double> (1.23, 4.56) << endl;
    	cout << ::max (1.23, 4.56) << endl;
    	char s1[] = "hello";
    	char s2[] = "world";
    	cout << ::max<string> (s1, s2) << endl;
    //	cout << ::max (s1, s2) << endl;
    	return 0;
    }
    
    ftmpl2.cpp
    #include <iostream>
    using namespace std;
    template<typename T>
    void foo (void) {
    	T t (100); // A t (100)
    	if (false)
    		cout << t.m_data << endl;
    	cout << t << endl;
    }
    class A {
    public:
    	A (int data) : m_data (data) {}
    private:
    	int m_data;
    };
    ostream& operator<< (ostream& os, A const& a) {
    	return os << a.m_data;
    }
    int main (void) {
    	foo<A> ();
    //	foo<int> ();
    	return 0;
    }
    
    ftmpl3.cpp
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    template<typename T>
    void foo (T const& x, T const& y) {
    	cout << "foo:T = " << typeid (T).name ()
    		<< endl;
    }
    template<typename T>
    void bar (T x, T y) {
    	cout << "bar:T = " << typeid (T).name ()
    		<< endl;
    }
    template<typename T>
    void hum (int a, int b) {
    	T t;
    	cout << "hum:T = " << typeid (T).name ()
    		<< endl;
    }
    template<typename R, typename T>
    //template<typename T, typename R>
    R fun (T const& t) {
    	R r;
    	cout << "fun:R = " << typeid (R).name ()
    		<< ",T = " << typeid (T).name () << endl;
    	return r;
    }
    int main (void) {
    	int a, b;
    	foo (a, b);
    	double c, d;
    	foo (c, d);
    	char e[256], f[256], g[255];
    	e[10] = 'A'; // *(e+10) = 'A'
    	cout << sizeof (e) << endl; // 256
    	foo (e, f); // 数组名e和f表示数组整体
    	bar (e, f); // 数组名e和f表示首元素地址
    //	foo (e, g);
    	bar (e, g);
    	foo ("hello", "world");
    //	foo ("hello", "tarena");
    	bar ("hello", "tarena");
    	hum<string> (10, 20);
    	int x;
    //	double y = fun<double, int> (x);
    	double y = fun<double> (x);
    	foo (c, (double)a); // 显式转换,隐式推断
    	foo<double> (c, a); // 显式实例化,隐式转换
    	return 0;
    }
    
    macro.cpp
    #include <iostream>
    using namespace std;
    #define MAX(T) 
    T max_##T (T x, T y) { 
    	return x < y ? y : x; 
    }
    MAX (int) // int max_int (int x, int y) { ... }
    MAX (double) // double max_double (...) { ... }
    MAX (string) // string max_string (...) { ... }
    #define max(T) max_##T
    int main (void) {
    	cout << max(int) (123, 456) << endl;
    //	cout << max_int (123, 456) << endl;
    	cout << max(double) (1.23, 4.56) << endl;
    	char s1[] = "hello";
    	char s2[] = "world";
    	cout << max(string) (s1, s2) << endl;
    	return 0;
    }
    
    overload.cpp
    #include <cstring>
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    template<typename T>
    T const& max (T const& x, T const& y) {
    	cout << "<1" << typeid (x).name () << '>'
    		<< flush;
    	return x < y ? y : x;
    }
    char const* const& max (char const* const& x,
    	char const* const& y) {
    	cout << "<2" << typeid (x).name () << '>'
    		<< flush;
    	return strcmp (x, y) < 0 ? y : x;
    }
    /*
    char const* max (char const* x, const char* y) {
    	return strcmp (x, y) < 0 ? y : x;
    }
    */
    template<typename T>
    T* const& max (T* const& x, T* const& y) {
    	cout << "<3" << typeid (x).name () << '>'
    		<< flush;
    	return *x < *y ? y : x;
    }
    template<typename T>
    T const& max (T const& x, T const& y, T const& z) {
    	cout << "<4" << typeid (x).name () << '>'
    		<< flush;
    	return ::max (::max (x, y), z);
    }
    /*
    char const* const& max (char const* const& x,
    	char const* const& y) {
    	cout << "<2" << typeid (x).name () << '>'
    		<< flush;
    	return strcmp (x, y) < 0 ? y : x;
    }
    */
    int main (void) {
    	cout << ::max (123, 456) << endl;
    	cout << ::max (1.23, 4.56) << endl;
    	cout << ::max<string> ("hello", "world")
    		<< endl;
    	cout << ::max ("hello", "world") << endl;
    	int x = 123, y = 456;
    	cout << *::max (&x, &y) << endl;
    	char const* a = "ABC";
    	char const* b = "AB";
    	char const* c = "A";
    	// 编译器优先选择普通函数
    	cout << ::max (a, b) << endl; // 2
    	// 除非函数模板能够产生具有更好匹配性的函数
    	int d = 100, e = 200;
    	cout << ::max (d, e) << endl; // 1
    	// 在参数传递过程中如果需要隐式类型转换,编译器
    	// 只能选择普通函数
    	cout << ::max (a, (char*)b) << endl; // 2
    	// 通过模板参数表告知编译器使用函数模板
    	// 针对指针的版本显然比任意类型版本更加具体
    	cout << ::max<> (b, a) << endl; // 3
    	// 显式指定的模板参数必须在所选择的重载版本中与
    	// 调用参数的类型保持一致
    	cout << ::max<char const*> (b, a) << endl; // 1
    	cout << ::max (123, 789, 456) << endl;
    	// 在函数模板的实例化函数中,编译器优先选择普通
    	// 函数,但是该普通函数必须声明于模板之前
    	cout << ::max (a, b, c) << endl;
    	char const* const& r = max (a, b, c);
    	cout << r << endl; // ABC
    	char const* g = "123";
    	char const* h = "12";
    	char const* i = "1";
    	max (g, h, i);
    	cout << r << endl; // ABC
    	return 0;
    }
    
    static.cpp
    #include <iostream>
    using namespace std;
    template<typename T>
    class A {
    public:
    	static int* addr (void) {
    		return &m_data;
    	}
    private:
    	static int m_data;
    };
    template<typename T>
    int A<T>::m_data = 0;
    int main (void) {
    	A<int> a1, a2;
    	A<double> a3, a4;
    	cout << a1.addr () << ' ' << a2.addr () << endl;
    	cout << a3.addr () << ' ' << a4.addr () << endl;
    	return 0;
    }
    
    typed.cpp
    #include <iostream>
    using namespace std;
    int max_int (int x, int y) {
    	return x < y ? y : x;
    }
    double max_double (double x, double y) {
    	return x < y ? y : x;
    }
    string max_string (string x, string y) {
    	return x < y ? y : x;
    }
    int main (void) {
    	cout << max_int (123, 456) << endl;
    	cout << max_double (1.23, 4.56) << endl;
    	cout << max_string ("hello", "world") << endl;
    	return 0;
    }
    
    untyped.cpp
    #include <iostream>
    using namespace std;
    #define max(x, y) ((x) < (y) ? (y) : (x))
    int main (void) {
    	cout << max (123, 456) << endl;
    	cout << max (1.23, 4.56) << endl;
    	char s2[] = "hello";
    	char s1[] = "world";
    	cout << max (s2, s1) << endl;
    	return 0;
    }
    
     
    day02
    array.cpp
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    template<typename T = int, size_t S = 3>
    class Array {
    public:
    	T& operator[] (size_t i) {
    		return m_array[i];
    	}
    	T const& operator[] (size_t i) const {
    		return const_cast<Array<T,S>&> (*this) [i];
    	}
    	void typeOf (void) const {
    		cout << typeid (m_array).name () << endl;
    	}
    private:
    	T m_array[S];
    };
    int square (int x) {
    	return x * x;
    }
    template<int x>
    int square (void) {
    	return x * x;
    }
    template<int/*float*//*double*//*string*/ x>
    void foo (void) { cout << x << endl; }
    template<char const* x>
    void bar (void) { cout << x << endl; }
    char const* g_global = "Hello, World !";
    static char g_static[] = "Hello, World !";
    char g_extern[] = "Hello, World !";
    int main (void) {
    //	Array<int, 5> a1;
    //	Array<int, 2+3> a1;
    	int const /*volatile*/ a = 2, b = 3;
    	Array<int, a+b> a1;
    	a1.typeOf ();
    	Array<string> a2;
    	a2.typeOf ();
    	int x;
    	cin >> x;
    	cout << square (x) << endl;
    	cout << square<13> () << endl;
    	foo<3> ();
    //	bar<"Hello, World !"> ();
    //	bar<g_global> ();
    //	bar<g_static> ();
    	bar<g_extern> ();
    	return 0;
    }
    
    defarg.cpp
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    template<typename A = long, typename B = A,
    	typename C = string>
    class D {
    public:
    	static void print (void) {
    		cout << typeid (A).name () << ' '
    			<< typeid (B).name () << ' '
    			<< typeid (C).name () << endl;
    	}
    };
    template<typename A = long, typename B = A,
    	typename C = string>
    void print (void) {
    	cout << typeid (A).name () << ' '
    		<< typeid (B).name () << ' '
    		<< typeid (C).name () << endl;
    }
    /*
    void foo (int x, int y = x) {
    	int a = 100, b = a;
    	cout << x << ' ' << y << endl;
    }
    */
    int main (void) {
    	D<char, short, int>::print ();
    	D<char, short>::print ();
    	D<char>::print ();
    	D<>::print ();
    	cout << "----------------" << endl;
    	print<char, short, int> ();
    	print<char, short> ();
    	print<char> ();
    	print<> ();
    //	foo (100);
    	return 0;
    }
    
    inherit.cpp
    #include <cstdlib>
    #include <iostream>
    using namespace std;
    template<typename T>
    class A {
    public:
    	A (void) : m_data (1234) {}
    	void foo (void) {
    		cout << "A::foo" << endl;
    	}
    	void exit (int status) {
    		cout << "再见!" << endl;
    	}
    protected:
    	int m_data;
    };
    template<typename T>
    class B : public A<T> {
    public:
    	void bar (void) {
    		/*
    		A<T>::foo ();
    		cout << A<T>::m_data << endl;
    		*/
    		this->foo ();
    		cout << this->m_data << endl;
    		this->exit (0);
    	}
    };
    int main (void) {
    	B<int> b;
    	b.bar ();
    	return 0;
    }
    
    init.cpp
    #include <iostream>
    using namespace std;
    template<typename T>
    void foo (void) {
    	T t = T ();
    //	string t = string ();
    //	int t = int ();
    	cout << '[' << t << ']' << endl;
    }
    int main (void) {
    	foo<string> ();
    	foo<int> ();
    	return 0;
    }
    
    part.cpp
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    // 通用版本
    template<typename A, typename B>
    class C {
    public:
    	static void print (void) {
    		cout << "C<A,B>" << endl;
    	}
    };
    // 针对B取short类型的局部特化版本
    template<typename A>
    class C<A, short> {
    public:
    	static void print (void) {
    		cout << "C<A,short>" << endl;
    	}
    };
    // 针对A和B取相同类型的局部特化版本
    template<typename A>
    class C<A, A> {
    public:
    	static void print (void) {
    		cout << "C<A,A>" << endl;
    	}
    };
    // 针对A和B都取指针的局部特化版本
    template<typename A, typename B>
    class C<A*, B*> {
    public:
    	static void print (void) {
    		cout << "C<A*,B*>" << endl;
    	}
    };
    // 针对A和B都去同类型指针的局部特化版本
    template<typename A>
    class C<A*, A*> {
    public:
    	static void print (void) {
    		cout << "C<A*,A*>" << endl;
    	}
    };
    // 针对数组的局部特化版本
    template<typename A, typename B>
    class C<A[], B[]> {
    public:
    	static void print (void) {
    		cout << "C<A[],B[]>" << endl;
    	}
    };
    template<typename A, typename B>
    void foo (void) {
    	cout << "通用版本" << endl;
    }
    template<>
    void foo<int, int> (void) {
    	cout << "完全特化" << endl;
    }
    /* 函数模板不能局部特化
    template<typename A>
    void foo<A, short> (void) {
    	cout << "局部特化" << endl;
    }
    */
    int main (void) {
    	C<int, char>::print ();
    	C<int, short>::print ();
    	C<double, short>::print ();
    	C<int, int>::print ();
    	C<double, double>::print ();
    //	C<short, short>::print ();
    	C<int*, char*>::print ();
    	C<int*, int*>::print ();
    	C<int[], char[]>::print ();
    	foo<char, short> ();
    	foo<int, int> ();
    	return 0;
    }
    
    spec.cpp
    #include <cstring>
    #include <iostream>
    using namespace std;
    // 通用版本
    template<typename T>
    T max (T x, T y) {
    	return x < y ? y : x;
    }
    // 针对char const*类型的重载版本
    char const* max (char const* x, char const* y) {
    	return strcmp (x, y) < 0 ? y : x;
    }
    // 通用版本
    template<typename T>
    class Comparator {
    public:
    	Comparator (T x, T y) : m_x (x), m_y (y) {}
    	T max (void) const {
    		return m_x < m_y ? m_y : m_x;
    	}
    private:
    	T m_x;
    	T m_y;
    };
    // 针对char const*类型的特化版本
    /*
    template<>
    class Comparator<char const*> {
    public:
    	static char const* zuidazhi (char const*x,
    		char const* y) {
    		return strcmp (x, y) < 0 ? y : x;
    	}
    };
    */
    // 针对char const*类型的成员特化版本
    template<>
    char const* Comparator<char const*>::max (
    	void) const {
    	return strcmp (m_x, m_y) < 0 ? m_y : m_x;
    }
    int main (void) {
    	cout << ::max (123, 456) << endl;
    	cout << ::max (1.23, 4.56) << endl;
    	cout << ::max<string> ("hello", "world")
    		<< endl;
    	cout << ::max ("hello", "world") << endl;
    	cout << "----------------" << endl;
    	cout << Comparator<int> (123, 456).max ()
    		<< endl;
    	cout << Comparator<double> (1.23, 4.56).max ()
    		<< endl;
    	cout << Comparator<string> ("hello",
    		"world").max () << endl;
    	/*
    	cout << Comparator<char const*>::zuidazhi (
    		"hello", "world") << endl;
    	*/
    	cout << Comparator<char const*> ("hello",
    		"world").max () << endl;
    	return 0;
    }
    
    template.cpp
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    class A {
    public:
    	template<typename T>
    	void foo (void) {
    		T t;
    		cout << typeid (t).name () << endl;
    	}
    	void bar (void) {
    		cout << "bar函数" << endl;
    	}
    };
    template<typename T>
    void bar (void) {
    	T a, *p = &a;
    	a.template foo<int> ();
    	a.bar ();
    	p->template foo<double> ();
    	p->bar ();
    }
    int main (void) {
    	A a;
    	a.foo<int> ();
    	a.foo<double> ();
    	bar<A> ();
    	return 0;
    }
    
    tmplarg.cpp
    #include <iostream>
    using namespace std;
    template<typename T>
    class A {
    public:
    	A (T const& t) : m_t (t) {}
    	void print (void) const {
    		cout <<"A:" << m_t << endl;
    	}
    private:
    	T m_t;
    };
    template<typename T>
    class C {
    public:
    	C (T const& t) : m_t (t) {}
    	void print (void) const {
    		cout << "C:" << m_t << endl;
    	}
    private:
    	T m_t;
    };
    template<typename T, template<typename> class D>
    class B {
    public:
    	B (T const& t) : m_d (t) {}
    //	A<T> m_a;
    //	C<T> m_c;
    	D<T> m_d;
    };
    int main (void) {
    	B<int, A> b1 (1234);
    	b1.m_d.print ();
    	B<string, C> b2 ("达内科技");
    	b2.m_d.print ();
    	return 0;
    }
    
    tmplarg2.cpp
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    template<typename A, typename B>
    class C {
    public:
    	static void print (void) {
    		cout << "C:" << typeid (A).name () << ' '
    			<< typeid (B).name () << endl;
    	}
    };
    template<typename A, typename B>
    class D {
    public:
    	static void print (void) {
    		cout << "D:" << typeid (A).name () << ' '
    			<< typeid (B).name () << endl;
    	}
    };
    template<typename A, typename B,
    	template<typename, typename> class Y>
    class X : public Y<A, B> {};
    int main (void) {
    	X<int, double, C>::print ();
    	X<short, string, D>::print ();
    	return 0;
    }
    
    typename.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	typedef unsigned int UINT;
    	typedef struct Student {
    		char name[128];
    		int age;
    	}	STUDENT;
    	class B {};
    };
    template</*typename*/class T>
    void foo (void) {
    	typename T::UINT x;
    	typename T::STUDENT y = {"张飞", 25};
    	typename T::B z;
    }
    int main (void) {
    	A::UINT x;
    	A::STUDENT y = {"张飞", 25};
    	A::B z;
    	foo<A> ();
    	return 0;
    }
    
    virtual.cpp
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    template<typename T>
    class A {
    public:
    	/*
    	template<typename B>
    	void foo (B const& b) {
    		cout << typeid (*this).name () << ' ' <<
    			typeid (b).name () << endl;
    	}
    	*/
    	template<typename B>
    	void foo (B const& b);
    	virtual void bar (void) {
    		cout << "A::bar" << endl;
    	}
    	/*
    	template<typename D>
    	virtual void hum (void) {
    		cout << "A::hum" << endl;
    	}
    	*/
    };
    template<typename T>
    	template<typename B>
    void A<T>::foo (B const& b) {
    	cout << typeid (*this).name () << ' ' <<
    		typeid (b).name () << endl;
    }
    template<typename T>
    class C : public A<T> {
    private:
    	void bar (void) {
    		cout << "C::bar" << endl;
    	}
    };
    int main (void) {
    	A<int> a;
    	double d;
    	a.foo (d);
    	C<double> c;
    	A<double>& r = c;
    	r.bar ();
    	return 0;
    }
    
    /error
    max.h
    #ifndef _MAX_H
    #define _MAX_H
    template<typename T> T max (T x, T y);
    template<typename T> class Comparator {
    public:
    	Comparator (T x, T y);
    	T max (void) const;
    private:
    	T m_x, m_y;
    };
    #endif // _MAX_H
    
    max.cpp
    #include <cstring>
    #include "max.h"
    template<typename T>
    T max (T x, T y) {
    	return x < y ? y : x;
    }
    char const* max (char const* x, char const* y) {
    	return strcmp (x, y) < 0 ? y : x;
    }
    template<typename T>
    Comparator<T>::Comparator (T x, T y) :
    	m_x (x), m_y (y) {}
    template<typename T>
    T Comparator<T>::max (void) const {
    	return m_x < m_y ? m_y : m_x;
    }
    template<>
    char const* Comparator<char const*>::max (
    	void) const {
    	return strcmp (m_x, m_y) < 0 ? m_y : m_x;
    }
    
    main.cpp
    #include <iostream>
    using namespace std;
    #include "max.h"
    int main (void) {
    	cout << ::max (123, 456) << endl;
    	cout << ::max (1.23, 4.56) << endl;
    	cout << ::max<string> ("hello", "world")
    		<< endl;
    	cout << ::max<char const*> ("hello", "world")
    		<< endl;
    	cout << "----------------" << endl;
    	cout << Comparator<int> (123, 456).max ()
    		<< endl;
    	cout << Comparator<double> (1.23, 4.56).max ()
    		<< endl;
    	cout << Comparator<string> ("hello",
    		"world").max () << endl;
    	cout << Comparator<char const*> ("hello",
    		"world").max () << endl;
    	return 0;
    }
    
    /export
    max.h
    #ifndef _MAX_H
    #define _MAX_H
    export template<typename T> T max (T x, T y);
    export template<typename T> class Comparator {
    public:
    	Comparator (T x, T y);
    	T max (void) const;
    private:
    	T m_x, m_y;
    };
    #endif // _MAX_H
    
    max.cpp
    #include <cstring>
    #include "max.h"
    template<typename T>
    T max (T x, T y) {
    	return x < y ? y : x;
    }
    char const* max (char const* x, char const* y) {
    	return strcmp (x, y) < 0 ? y : x;
    }
    template<typename T>
    Comparator<T>::Comparator (T x, T y) :
    	m_x (x), m_y (y) {}
    template<typename T>
    T Comparator<T>::max (void) const {
    	return m_x < m_y ? m_y : m_x;
    }
    template<>
    char const* Comparator<char const*>::max (
    	void) const {
    	return strcmp (m_x, m_y) < 0 ? m_y : m_x;
    }
    
    main.cpp
    #include <iostream>
    using namespace std;
    #include "max.h"
    int main (void) {
    	cout << ::max (123, 456) << endl;
    	cout << ::max (1.23, 4.56) << endl;
    	cout << ::max<string> ("hello", "world")
    		<< endl;
    	cout << ::max<char const*> ("hello", "world")
    		<< endl;
    	cout << "----------------" << endl;
    	cout << Comparator<int> (123, 456).max ()
    		<< endl;
    	cout << Comparator<double> (1.23, 4.56).max ()
    		<< endl;
    	cout << Comparator<string> ("hello",
    		"world").max () << endl;
    	cout << Comparator<char const*> ("hello",
    		"world").max () << endl;
    	return 0;
    }
    
    /include
    max.h
    #ifndef _MAX_H
    #define _MAX_H
    template<typename T> T max (T x, T y);
    template<typename T> class Comparator {
    public:
    	Comparator (T x, T y);
    	T max (void) const;
    private:
    	T m_x, m_y;
    };
    #include "max.cpp"
    #endif // _MAX_H
    
    max.cpp
    #include <cstring>
    template<typename T>
    T max (T x, T y) {
    	return x < y ? y : x;
    }
    char const* max (char const* x, char const* y) {
    	return strcmp (x, y) < 0 ? y : x;
    }
    template<typename T>
    Comparator<T>::Comparator (T x, T y) :
    	m_x (x), m_y (y) {}
    template<typename T>
    T Comparator<T>::max (void) const {
    	return m_x < m_y ? m_y : m_x;
    }
    template<>
    char const* Comparator<char const*>::max (
    	void) const {
    	return strcmp (m_x, m_y) < 0 ? m_y : m_x;
    }
    
    main.cpp
    #include <iostream>
    using namespace std;
    #include "max.h"
    int main (void) {
    	cout << ::max (123, 456) << endl;
    	cout << ::max (1.23, 4.56) << endl;
    	cout << ::max<string> ("hello", "world")
    		<< endl;
    	cout << ::max ("hello", "world") << endl;
    	cout << "----------------" << endl;
    	cout << Comparator<int> (123, 456).max ()
    		<< endl;
    	cout << Comparator<double> (1.23, 4.56).max ()
    		<< endl;
    	cout << Comparator<string> ("hello",
    		"world").max () << endl;
    	cout << Comparator<char const*> ("hello",
    		"world").max () << endl;
    	return 0;
    }
    
    /inst
    max.h
    #ifndef _MAX_H
    #define _MAX_H
    template<typename T> T max (T x, T y);
    char const* max (char const*, char const*);
    template<typename T> class Comparator {
    public:
    	Comparator (T x, T y);
    	T max (void) const;
    private:
    	T m_x, m_y;
    };
    #endif // _MAX_H
    
    max.cpp
    #include <cstring>
    #include <string>
    using namespace std;
    #include "max.h"
    template<typename T>
    T max (T x, T y) {
    	return x < y ? y : x;
    }
    char const* max (char const* x, char const* y) {
    	return strcmp (x, y) < 0 ? y : x;
    }
    template<typename T>
    Comparator<T>::Comparator (T x, T y) :
    	m_x (x), m_y (y) {}
    template<typename T>
    T Comparator<T>::max (void) const {
    	return m_x < m_y ? m_y : m_x;
    }
    template<>
    char const* Comparator<char const*>::max (
    	void) const {
    	return strcmp (m_x, m_y) < 0 ? m_y : m_x;
    }
    // 显式实例化
    template int max<int> (int, int);
    template double max<double> (double, double);
    template string max<string> (string, string);
    template class Comparator<int>;
    template class Comparator<double>;
    template class Comparator<string>;
    template class Comparator<char const*>;
    
    main.cpp
    #include <iostream>
    using namespace std;
    #include "max.h"
    int main (void) {
    	cout << ::max (123, 456) << endl;
    	cout << ::max (1.23, 4.56) << endl;
    	cout << ::max<string> ("hello", "world")
    		<< endl;
    	cout << ::max ("hello", "world") << endl;
    	cout << "----------------" << endl;
    	cout << Comparator<int> (123, 456).max ()
    		<< endl;
    	cout << Comparator<double> (1.23, 4.56).max ()
    		<< endl;
    	cout << Comparator<string> ("hello",
    		"world").max () << endl;
    	cout << Comparator<char const*> ("hello",
    		"world").max () << endl;
    	return 0;
    }
    
     
    day03
    defarg.cpp
    #include <iostream>
    #include <typeinfo>
    using namespace std;
    template<typename T = int>
    void foo (T t) {
    	cout << typeid (t).name () << endl;
    }
    int main (void) {
    	foo (1.23); // 隐式推断优先
    	return 0;
    }
    
    list.cpp
    // 双向线性链表容器
    #include <cstring>
    #include <iostream>
    #include <stdexcept>
    using namespace std;
    template<typename T>
    class List {
    public:
    	// 构造、析构、拷贝构造、拷贝赋值
    	List (void) : m_head (NULL), m_tail (NULL) {}
    	~List (void) {
    		clear ();
    	}
    	List (List const& that) : m_head (NULL),
    		m_tail (NULL) {
    		for (Node* node = that.m_head; node;
    			node = node->m_next)
    			push_back (node->m_data);
    	}
    	List& operator= (List const& rhs) {
    		if (&rhs != this) {
    			List list = rhs;
    			swap (m_head, list.m_head);
    			swap (m_tail, list.m_tail);
    		}
    		return *this;
    	}
    	// 获取首元素
    	T& front (void) {
    		if (empty ())
    			throw underflow_error ("链表下溢!");
    		return m_head->m_data;
    	}
    	T const& front (void) const {
    		return const_cast<List*> (this)->front ();
    	}
    	// 向首部压入
    	void push_front (T const& data) {
    		m_head = new Node (data, NULL, m_head);
    		if (m_head->m_next)
    			m_head->m_next->m_prev = m_head;
    		else
    			m_tail = m_head;
    	}
    	// 从首部弹出
    	void pop_front (void) {
    		if (empty ())
    			throw underflow_error ("链表下溢!");
    		Node* next = m_head->m_next;
    		delete m_head;
    		m_head = next;
    		if (m_head)
    			m_head->m_prev = NULL;
    		else
    			m_tail = NULL;
    	}
    	// 获取尾元素
    	T& back (void) {
    		if (empty ())
    			throw underflow_error ("链表下溢!");
    		return m_tail->m_data;
    	}
    	T const& back (void) const {
    		return const_cast<List*> (this)->back ();
    	}
    	// 向尾部压入
    	void push_back (T const& data) {
    		m_tail = new Node (data, m_tail);
    		if (m_tail->m_prev)
    			m_tail->m_prev->m_next = m_tail;
    		else
    			m_head = m_tail;
    	}
    	// 从尾部弹出
    	void pop_back (void) {
    		if (empty ())
    			throw underflow_error ("链表下溢!");
    		Node* prev = m_tail->m_prev;
    		delete m_tail;
    		m_tail = prev;
    		if (m_tail)
    			m_tail->m_next = NULL;
    		else
    			m_head = NULL;
    	}
    	// 删除所有匹配元素
    	void remove (T const& data) {
    		for (Node* node = m_head, *next; node;
    			node = next) {
    			next = node->m_next;
    			if (equal (node->m_data, data)) {
    				if (node->m_prev)
    					node->m_prev->m_next =
    						node->m_next;
    				else
    					m_head = node->m_next;
    				if (node->m_next)
    					node->m_next->m_prev =
    						node->m_prev;
    				else
    					m_tail = node->m_prev;
    				delete node;
    			}
    		}
    	}
    	// 清空
    	void clear (void) {
    		for (Node* next; m_head; m_head = next) {
    			next = m_head->m_next;
    			delete m_head;
    		}
    		m_tail = NULL;
    	}
    	// 判空
    	bool empty (void) const {
    		return ! m_head && ! m_tail;
    	}
    	// 大小
    	size_t size (void) const {
    		size_t nodes = 0;
    		for (Node* node = m_head; node;
    			node = node->m_next)
    			++nodes;
    		return nodes;
    	}
    	// SHIT !
    	T& operator[] (size_t i) {
    		for (Node* node = m_head; node;
    			node = node->m_next)
    			if (i-- == 0)
    				return node->m_data;
    		throw out_of_range ("链表越界!");
    	}
    	// 输出
    	friend ostream& operator<< (ostream& os,
    		List const& list) {
    		for (Node* node = list.m_head; node;
    			node = node->m_next)
    			os << *node;
    		return os;
    	}
    private:
    	// 节点
    	class Node {
    	public:
    		Node (T const& data, Node* prev = NULL,
    			Node* next = NULL) : m_data (data),
    			m_prev (prev), m_next (next) {}
    		friend ostream& operator<< (ostream& os,
    			Node const& node) {
    			return os << '(' << node.m_data << ')';
    		}
    		T     m_data; // 数据
    		Node* m_prev; // 前指针
    		Node* m_next; // 后指针
    	};
    	// 通用版本
    	bool equal (T const& x, T const& y) const {
    		return x == y;
    	}
    	Node* m_head; // 头指针
    	Node* m_tail; // 尾指针
    public:
    	// 正向迭代器
    	class Iterator {
    	public:
    		Iterator (Node* head = NULL,
    			Node* tail = NULL, Node* node = NULL) :
    			m_head (head), m_tail (tail),
    			m_node (node) {}
    		bool operator== (Iterator const& it) const {
    			return m_node == it.m_node;
    		}
    		bool operator!= (Iterator const& it) const {
    			return ! (*this == it);
    		}
    		Iterator& operator++ (void) {
    			if (m_node)
    				m_node = m_node->m_next;
    			else
    				m_node = m_head;
    			return *this;
    		}
    		Iterator const operator++ (int) {
    			Iterator old = *this;
    			++*this;
    			return old;
    		}
    		Iterator& operator-- (void) {
    			if (m_node)
    				m_node = m_node->m_prev;
    			else
    				m_node = m_tail;
    			return *this;
    		}
    		Iterator const operator-- (int) {
    			Iterator old = *this;
    			--*this;
    			return old;
    		}
    		T& operator* (void) const {
    			return m_node->m_data;
    		}
    		T* operator-> (void) const {
    			return &**this;
    		}
    	private:
    		Node* m_head;
    		Node* m_tail;
    		Node* m_node;
    		friend class List;
    	};
    	// 获取起始正向迭代器
    	Iterator begin (void) {
    		return Iterator (m_head, m_tail, m_head);
    	}
    	// 获取终止正向迭代器
    	Iterator end (void) {
    		return Iterator (m_head, m_tail);
    	}
    	// 插入
    	Iterator insert (Iterator loc, T const& data) {
    		if (loc == end ()) {
    			push_back (data);
    			return Iterator (m_head, m_tail,
    				m_tail);
    		}
    		else {
    			Node* node = new Node (data,
    				loc.m_node->m_prev, loc.m_node);
    			if (node->m_prev)
    				node->m_prev->m_next = node;
    			else
    				m_head = node;
    			node->m_next->m_prev = node;
    			return Iterator (m_head, m_tail, node);
    		}
    	}
    	// 删除
    	Iterator erase (Iterator loc) {
    		if (loc == end ())
    			throw invalid_argument ("无效参数!");
    		if (loc.m_node->m_prev)
    			loc.m_node->m_prev->m_next =
    				loc.m_node->m_next;
    		else
    			m_head = loc.m_node->m_next;
    		if (loc.m_node->m_next)
    			loc.m_node->m_next->m_prev =
    				loc.m_node->m_prev;
    		else
    			m_tail = loc.m_node->m_prev;
    		Node* next = loc.m_node->m_next;
    		delete loc.m_node;
    		return Iterator (m_head, m_tail, next);
    	}
    	// 常正向迭代器
    	// 反向迭代器
    	// 常反向迭代器
    };
    // 针对char const*类型的特化版本
    template<>
    bool List<char const*>::equal (char const* const& x,
    	char const* const& y) const {
    	return ! strcmp (x, y);
    }
    // 线性查找
    template<typename IT, typename T>
    IT find (IT begin, IT end, T const& key) {
    	IT it;
    	for (it = begin; it != end; ++it)
    		if (*it == key)
    			break;
    	return it;
    }
    // 测试用例
    void test1 (void) {
    	List<int> l1;
    	l1.push_front (30);
    	l1.push_front (20);
    	l1.push_front (10);
    	cout << l1 << endl; // 10 20 30
    	l1.pop_front ();
    	cout << l1 << endl; // 20 30
    	l1.front () += 5;
    	cout << l1 << endl; // 25 30
    	List<int> const& cr = l1;
    	cout << cr.front () << endl;
    //	cr.front () = 20;
    	l1.push_back (40);
    	l1.push_back (50);
    	l1.push_back (60);
    	cout << l1 << endl; // 25 30 40 50 60
    	l1.pop_back ();
    	cout << l1 << endl; // 25 30 40 50
    	--l1.back ();
    	cout << l1 << endl; // 25 30 40 49
    	List<int> const* cp = &l1;
    	cout << cp->back () << endl;
    //	cp->back ()++;
    	l1.push_front (40);
    	l1.push_back (40);
    	l1.push_back (40);
    	cout << l1 << endl; // 40 25 30 40 49 40 40
    	l1.remove (40);
    	cout << l1 << endl; // 25 30 49
    	cout << l1.size () << endl; // 3
    	cout << boolalpha << l1.empty () << endl;
    	// false
    	l1.clear ();
    	cout << l1.size () << endl; // 0
    	cout << l1.empty () << endl; // true
    	l1.push_back (100);
    	l1.push_back (200);
    	l1.push_back (300);
    	List<int> l2 = l1; // 拷贝构造
    	cout << "l1:" << l1 << endl; // 100 200 300
    	cout << "l2:" << l2 << endl; // 100 200 300
    	l1.pop_front ();
    	++l2.back ();
    	cout << "l1:" << l1 << endl; // 200 300
    	cout << "l2:" << l2 << endl; // 100 200 301
    	l2 = l1; // 拷贝赋值
    	cout << "l1:" << l1 << endl; // 200 300
    	cout << "l2:" << l2 << endl; // 200 300
    	l1.push_front (100);
    	l2.back () = 400;
    	cout << "l1:" << l1 << endl; // 100 200 300
    	cout << "l2:" << l2 << endl; // 200 400
    }
    void test2 (void) {
    	char sa[][256] = {
    		"北京", "天津", "上海",
    		"天津", "北京", "天津"};
    	List<string> l1;
    	for (size_t i = 0; i < 6; ++i)
    		l1.push_back (sa[i]);
    	cout << l1 << endl;
    	l1.remove ("天津");
    	cout << l1 << endl;
    	List<char const*> l2;
    	for (size_t i = 0; i < 6; ++i)
    		l2.push_back (sa[i]);
    	cout << l2 << endl;
    	l2.remove ("天津");
    	cout << l2 << endl;
    }
    void test3 (void) {
    	List<int> l1;
    	l1.push_back (13);
    	l1.push_back (26);
    	l1.push_back (19);
    	l1.push_back (26);
    	l1.push_back (37);
    	cout << l1 << endl;
    	/*
    	size_t size = l1.size ();
    	for (size_t i = 0; i < size; ++i)
    		++l1[i];
    	*/
    	for (List<int>::Iterator it = l1.begin ();
    		it != l1.end (); ++it)
    		++*it;
    	cout << l1 << endl;
    }
    void test4 (void) {
    	List<int> l1;
    	l1.insert (
    		l1.insert (
    			l1.insert (
    				l1.insert (
    					l1.insert (l1.end (), 50),
    				40),
    			30),
    		20),
    	10);
    	cout << l1 << endl; // 10 20 30 40 50
    	List<int>::Iterator loc = l1.begin ();
    	l1.insert (++++loc, 25);
    	cout << l1 << endl;
    	l1.insert (l1.begin (), 5);
    	cout << l1 << endl;
    	l1.insert (l1.end (), 55);
    	cout << l1 << endl;
    	loc = l1.end ();
    	l1.erase (l1.erase (l1.erase (--------loc)));
    	cout << l1 << endl;
    }
    void test5 (void) {
    	int ai[] = {17, 23, 44, 19, 23};
    	int* p = find (ai, ai + 5, /*45*/44);
    	if (p == ai + 5)
    		cout << "没找到!" << endl;
    	else
    		cout << "找到了:" << *p << endl;
    	List<string> ls;
    	ls.push_back ("张飞");
    	ls.push_back ("赵云");
    	ls.push_back ("关羽");
    	ls.push_back ("刘备");
    	ls.push_back ("曹操");
    	List<string>::Iterator it = find (ls.begin (),
    		ls.end (), "刘备"/*"黄忠"*/);
    	if (it == ls.end ())
    		cout << "没找到!" << endl;
    	else
    		cout << "找到了:" << *it << endl;
    }
    int main (void) {
    //	test1 ();
    //	test2 ();
    //	test3 ();
    //	test4 ();
    	test5 ();
    	return 0;
    }
    
    nontype.cpp
    #include <iostream>
    using namespace std;
    int square (int x) {
    	return x * x;
    }
    template<int x>
    int square2 (void) {
    	return x * x;
    }
    int main (void) {
    	cout << square (13) << endl;
    	cout << square (14) << endl;
    	cout << square2<13> () << endl;
    	cout << square2<14> () << endl;
    	return 0;
    }
    
    poly.cpp
    #include <iostream>
    using namespace std;
    int add (int x, int y) {
    	return x + y;
    }
    int sub (int x, int y) {
    	return x - y;
    }
    int mul (int x, int y) {
    	return x * y;
    }
    int div (int x, int y) {
    	return x / y;
    }
    // 基于函数指针的多态函数
    int cal (int x, int y, int (*pfunc) (int, int)) {
    	return pfunc (x, y);
    }
    class Cal {
    public:
    	virtual int cal (int x, int y) const = 0;
    };
    class Add : public Cal {
    public:
    	int cal (int x, int y) const { return x + y; }
    };
    class Sub : public Cal {
    public:
    	int cal (int x, int y) const { return x - y; }
    };
    class Mul : public Cal {
    public:
    	int cal (int x, int y) const { return x * y; }
    };
    class Div : public Cal {
    public:
    	int cal (int x, int y) const { return x / y; }
    };
    // 基于虚函数的多态函数
    int cal (int x, int y, Cal const& c) {
    	return c.cal (x, y);
    }
    class A {
    public:
    	static int cal (int x, int y) {
    		return x + y; }
    };
    class S {
    public:
    	static int cal (int x, int y) {
    		return x - y; }
    };
    class M {
    public:
    	static int cal (int x, int y) {
    		return x * y; }
    };
    class D {
    public:
    	static int cal (int x, int y) {
    		return x / y; }
    };
    // 基于模板的多态函数
    template<typename T>
    int cal (int x, int y) {
    	return T::cal (x, y);
    }
    int main (void) {
    	cout << cal (200, 100, add) << endl;
    	cout << cal (200, 100, sub) << endl;
    	cout << cal (200, 100, mul) << endl;
    	cout << cal (200, 100, div) << endl;
    	cout << "--------" << endl;
    	cout << cal (200, 100, Add ()) << endl;
    	cout << cal (200, 100, Sub ()) << endl;
    	cout << cal (200, 100, Mul ()) << endl;
    	cout << cal (200, 100, Div ()) << endl;
    	cout << "--------" << endl;
    	cout << cal<A> (200, 100) << endl;
    	cout << cal<S> (200, 100) << endl;
    	cout << cal<M> (200, 100) << endl;
    	cout << cal<D> (200, 100) << endl;
    	return 0;
    }
    
    virtual.cpp
    #include <iostream>
    using namespace std;
    class A {
    public:
    	template<int x>
    	virtual int square (void) const {
    		return x * x;
    	}
    };
    int main (void) {
    	A a;
    	cout << a.square<13> () << endl;
    	cout << a.square<14> () << endl;
    	return 0;
    };
    
     
    day04
    deque.cpp
    #include <deque>
    #include "print.h"
    int main (void) {
    	deque<int> di;
    	di.push_front (30);
    	di.push_front (20);
    	di.push_front (10);
    	print (di.begin (), di.end ()); // 10 20 30
    	di.pop_front ();
    	print (di.begin (), di.end ()); // 20 30
    	di.push_back (40);
    	di.push_back (50);
    	di.push_back (60);
    	print (di.begin (), di.end ());
    	// 20 30 40 50 60
    	di.pop_back ();
    	print (di.begin (), di.end ()); // 20 30 40 50
    	di[1] += 5;
    	*(di.begin () + 2) -= 3;
    	print (di.begin (), di.end ()); // 20 35 37 50
    //	cout << di.capacity () << endl;
    	cout << di.size () << endl;
    	return 0;
    }
    
    list.cpp
    #include <list>
    #include <algorithm>
    #include "print.h"
    int main (void) {
    	list<int> l1;
    	l1.push_back (10);
    	l1.push_back (20);
    	l1.push_back (20);
    	l1.push_back (20);
    	l1.push_back (10);
    	l1.push_back (30);
    	l1.push_back (30);
    	l1.push_back (20);
    	l1.push_back (30);
    	l1.push_back (30);
    	print (l1.begin (), l1.end ());
    	l1.sort ();
    	print (l1.begin (), l1.end ());
    	l1.unique ();
    	print (l1.begin (), l1.end ()); // 10 20 30
    	list<int> l2;
    	l2.push_back (10000);
    	l2.push_back (20000);
    	l2.push_back (30000);
    	l2.push_back (40000);
    	list<int>::iterator pos = l1.begin ();
    	++pos;
    	/*
    	l1.splice (pos, l2);
    	*//*
    	list<int>::iterator del = l2.end ();
    	----del;
    	l1.splice (pos, l2, del);
    	*/
    	list<int>::iterator begin = l2.begin ();
    	++begin;
    	list<int>::iterator end = l2.end ();
    	--end;
    	l1.splice (pos, l2, begin, end);
    	cout << "l1:" << flush;
    	print (l1.begin (), l1.end ());
    	cout << "l2:" << flush;
    	print (l2.begin (), l2.end ());
    	list<int> l3;
    	l3.push_back (16);
    	l3.push_back (22);
    	l3.push_back (28);
    	l3.push_back (43);
    	l3.push_back (57);
    	list<int> l4;
    	l4.push_back (25);
    	l4.push_back (33);
    	l4.push_back (51);
    	l3.merge (l4); // O(N)
    	cout << "l3:" << flush;
    	print (l3.begin (), l3.end ());
    	cout << "l4:" << flush;
    	print (l4.begin (), l4.end ());
    	return 0;
    }
    
    map.cpp
    #include <iostream>
    #include <map>
    using namespace std;
    int main (void) {
    	map<string, int> msi;
    	msi.insert (pair<string, int> ("张飞", 10000));
    	msi.insert (make_pair ("赵云", 20000));
    	msi["关羽"] = 30000;
    	typedef map<string, int>::iterator IT;
    	IT it = msi.find ("赵云"); // O(logN)
    	cout << it->first << ":" << it->second << endl;
    	cout << msi["赵云"] << endl;
    //	msi["张飞"] = 40000;
    	pair<IT, bool> res = msi.insert (pair<string,
    		int> ("张飞2", 40000));
    	if (! res.second)
    		cout << "插入失败!" << endl;
    	else
    		cout << "插入成功:" << res.first->first
    			<< ',' << res.first->second << endl;
    	for (IT it = msi.begin (); it != msi.end ();
    		++it)
    		cout << it->first << ":" << it->second
    			<< endl;
    	return 0;
    }
    
    mmap.cpp
    #include <iostream>
    #include <map>
    using namespace std;
    int main (void) {
    	multimap<string, int> msi;
    	msi.insert (pair<string, int> ("张飞", 10000));
    	msi.insert (make_pair ("赵云", 20000));
    	typedef multimap<string, int>::iterator IT;
    	msi.insert (pair<string, int> ("张飞", 40000));
    	for (IT it = msi.begin (); it != msi.end ();
    		++it)
    		cout << it->first << ":" << it->second
    			<< endl;
    	IT l = msi.lower_bound ("赵云");
    	cout << l->first << "," << l->second << endl;
    	IT u = msi.upper_bound ("赵云");
    //	cout << u->first << "," << u->second << endl;
    	for (IT it = l; it != u; ++it)
    		cout << it->first << "," << it->second
    			<< endl;
    	return 0;
    }
    
    mset.cpp
    #include <iostream>
    #include <set>
    using namespace std;
    int main (void) {
    	multiset<int> si;
    	si.insert (10);
    	si.insert (20);
    	si.insert (10);
    	si.insert (30);
    	si.insert (20);
    	si.insert (40);
    	for (multiset<int>::iterator it = si.begin ();
    		it != si.end (); ++it)
    		cout << *it << ' ';
    	cout << endl;
    	return 0;
    }
    
    print.h
    #include <iostream>
    using namespace std;
    template<typename iterator>
    void print (iterator begin, iterator end) {
    	while (begin != end)
    		cout << *begin++ << ' ';
    	cout << endl;
    }
    
    set.cpp
    #include <iostream>
    #include <set>
    using namespace std;
    int main (void) {
    	set<int> si;
    	si.insert (10);
    	si.insert (20);
    	si.insert (10); // 失败
    	si.insert (30);
    	si.insert (20); // 失败
    	si.insert (40);
    	for (set<int>::iterator it = si.begin ();
    		it != si.end (); ++it)
    		cout << *it << ' ';
    	cout << endl;
    	return 0;
    }
    
    sq.cpp
    #include <iostream>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <list>
    using namespace std;
    class CmpInt {
    public:
    	bool operator() (int a, int b) const {
    		return a > b;
    	}
    };
    int main (void) {
    //	stack<string, /*vector*/list<string> > ss;
    	stack<string> ss;
    	ss.push ("C++");
    	ss.push ("喜欢");
    	ss.push ("我们");
    	while (! ss.empty ()) {
    		cout << ss.top () << flush;
    		ss.pop ();
    	}
    	cout << endl;
    //	queue<string, list<string> > qs;
    	queue<string> qs;
    	qs.push ("我们");
    	qs.push ("讨厌");
    	qs.push ("Java");
    	while (! qs.empty ()) {
    		cout << qs.front () << flush;
    		qs.pop ();
    	}
    	cout << endl;
    //	priority_queue<int, vector<int> > pi;
    	priority_queue<int, vector<int>, CmpInt> pi;
    	pi.push (26);
    	pi.push (19);
    	pi.push (37);
    	pi.push (11);
    	pi.push (88);
    	while (! pi.empty ()) {
    		cout << pi.top () << ' ' << flush;
    		pi.pop ();
    	}
    	cout << endl;
    	return 0;
    }
    
    vector1.cpp
    #include <iostream>
    #include <vector>
    using namespace std;
    void print (vector<int> const& vi) {
    	size_t size = vi.size ();
    	cout << "大小:" << size << endl;
    	cout << "内容:" << flush;
    	for (size_t i = 0; i < size; ++i)
    		cout << vi[i] << ' '; // *(p+i), O(1)
    	cout << endl;
    }
    void show (vector<int> const& vi) {
    	cout << "迭代:" << flush;
    	for (vector<int>::const_iterator it =
    		vi.begin (); it != vi.end (); ++it)
    		cout << *it << ' ';
    	cout << endl;
    }
    void rshow (vector<int> const& vi) {
    	cout << "反向:" << flush;
    	for (vector<int>::const_reverse_iterator it =
    		vi.rbegin (); it != vi.rend (); ++it)
    		cout << *it << ' ';
    	cout << endl;
    }
    int main (void) {
    	vector<int> v1;
    	print (v1);
    	vector<int> v2 (5);
    	print (v2);
    	vector<int> v3 (5, 13);
    	print (v3);
    	int a[] = {10, 20, 30, 40, 50};
    //	vector<int> v4 (a, a + 5);
    	vector<int> v4 (&a[0], &a[5]);
    	print (v4);
    	show (v4);
    	rshow (v4);
    	++v4[2];
    	show (v4);
    	++*(v4.begin () + 2);
    	show (v4);
    	vector<int>::iterator it = v4.begin ();
    //	++++it;
    	it += 2;
    	++*it;
    	show (v4);
    	vector<int>::iterator it2 = v4.begin ();
    	cout << boolalpha << (it > it2) << endl;
    	cout << it - it2 << endl;
    //	cout << it + it2 << endl;
    	vector<int>::reverse_iterator it3 =
    		v4.rbegin (), it4 = it3;
    	it4 += 2;
    	cout << *it4 << ' ' << *it3 << endl;
    	cout << (it3 > it4) << endl;
    	cout << it3 - it4 << endl;
    	vector<int> const* cp = &v4;
    	vector<int>::const_iterator cit = cp->begin ();
    	cout << *cit << endl;
    //	*cit = 100;
    	it = v4.begin ();
    	cout << *it << endl; // 10
    	v4.push_back (60);
    	it = v4.begin ();
    	cout << *it << endl; // 10
    	show (v4);
    	return 0;
    }
    
    vector2.cpp
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    void show (vector<int> const& vi) {
    	for (vector<int>::const_iterator it =
    		vi.begin (); it != vi.end (); ++it)
    		cout << *it << ' ';
    	cout << endl;
    }
    bool cmpint (int a, int b) {
    	return a > b;
    }
    class CmpInt {
    public:
    	bool operator() (int a, int b) const {
    		return a > b;
    	}
    };
    class Student {
    public:
    	Student (string const& name, int age) :
    		m_name (name), m_age (age) {}
    	bool operator< (Student const& rhs) const {
    //		return m_name < rhs.m_name;
    		return m_age < rhs.m_age;
    	}
    	friend ostream& operator<< (ostream& os,
    		Student const& student) {
    		return os << student.m_name << ','
    			<< student.m_age;
    	}
    private:
    	string m_name;
    	int m_age;
    	friend class OrderByName;
    	friend class OrderByAge;
    	friend class OrderByNameAndAge;
    };
    class OrderByName {
    public:
    	bool operator() (Student const& a,
    		Student const& b) const {
    		return a.m_name < b.m_name;
    	}
    };
    class OrderByAge {
    public:
    	bool operator() (Student const& a,
    		Student const& b) const {
    		return a.m_age < b.m_age;
    	}
    };
    class OrderByNameAndAge {
    public:
    	bool operator() (Student const& a,
    		Student const& b) const {
    		if (a.m_name == b.m_name)
    			return a.m_age > b.m_age;
    		return a.m_name < b.m_name;
    	}
    };
    int main (void) {
    	vector<int> vi;
    	vi.push_back (10);
    	vi.push_back (20);
    	vi.push_back (30);
    	vi.push_back (20);
    	vi.push_back (50);
    	show (vi);
    	/*
    	// 将向量中的第二个20改成40
    	vector<int>::iterator it = find (vi.begin (),
    		vi.end (), 20);
    	it = find (it+1, vi.end (), 20);
    	*it = 40;
    	*/
    	// 将向量中所有的20都改成40
    	for (vector<int>::iterator begin = vi.begin ();
    		begin != vi.end (); ++begin) {
    		vector<int>::iterator it = find (begin,
    			vi.end (), 20);
    		if (it == vi.end ())
    			break;
    		*it = 40;
    		begin = it;
    	}
    	show (vi);
    	vector<int> v2;
    	v2.push_back (50);
    	v2.push_back (40);
    	v2.push_back (30);
    	v2.push_back (20);
    	v2.push_back (10);
    	show (v2);
    	sort (v2.begin () + 1, v2.end () - 1);
    	show (v2);
    	sort (v2.begin (), v2.end ());
    	show (v2);
    //	sort (v2.rbegin (), v2.rend ());
    //	sort (v2.begin (), v2.end (), cmpint);
    	sort (v2.begin (), v2.end (), CmpInt ());
    	show (v2);
    	vector<Student> vs;
    	vs.push_back (Student ("zhangfei", 25));
    	vs.push_back (Student ("zhaoyun", 22));
    	vs.push_back (Student ("zhangfei", 20));
    	vs.push_back (Student ("zhaoyun", 28));
    	vs.push_back (Student ("guanyu", 60));
    //	sort (vs.begin (), vs.end (), OrderByName ());
    //	sort (vs.begin (), vs.end (), OrderByAge ());
    	sort (vs.begin (), vs.end (),
    		OrderByNameAndAge ());
    	for (vector<Student>::iterator it = vs.begin ();
    		it != vs.end (); ++it)
    		cout << *it << endl;
    	return 0;
    }
    
    vector3.cpp
    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    class A {
    public:
    	A (void) : m_data (0) {
    		cout << "缺省构造:" << this << endl;
    	}
    	A (int data) : m_data (data) {
    		cout << "有参构造:" << this << endl;
    	}
    	~A (void) {
    		cout << "析构函数:" << this << endl;
    	}
    	A (A const& that) : m_data (that.m_data) {
    		cout << "拷贝构造:" << &that << "->"
    			<< this << endl;
    	}
    	A& operator= (A const& rhs) {
    		m_data = rhs.m_data;
    		cout << "拷贝赋值:" << &rhs << "->"
    			<< this << endl;
    	}
    	/*
    	bool operator< (A const& rhs) const {
    		return m_data < rhs.m_data;
    	}
    	*/
    	bool operator== (A const& rhs) const {
    		return m_data == rhs.m_data;
    	}
    	friend ostream& operator<< (ostream& os,
    		A const& a) {
    		return os << a.m_data;
    	}
    private:
    	int m_data;
    	friend class CmpA;
    };
    class CmpA {
    public:
    	bool operator() (A const& x, A const& y) const {
    		return x.m_data < y.m_data;
    	}
    };
    int main (void) {
    	cout << "-------- 1 --------" << endl;
    //	vector<A> v1 (3);
    	vector<A> v1 (3, 10);
    	cout << "-------- 2 --------" << endl;
    	v1.push_back (10);
    	cout << "-------- 3 --------" << endl;
    	v1.erase (v1.begin ());
    	cout << "-------- 4 --------" << endl;
    	v1[0] = 17;
    	v1[1] = 15;
    	v1[2] = 29;
    //	sort (v1.begin (), v1.end ());
    	sort (v1.begin (), v1.end (), CmpA ());
    	for (vector<A>::iterator it = v1.begin ();
    		it != v1.end (); ++it)
    		cout << *it << ' ';
    	cout << endl;
    	vector<A>::iterator it = find (
    		v1.begin (), v1.end (), 17);
    	if (it == v1.end ())
    		cout << "没找到!" << endl;
    	else
    		cout << "找到了:" << *it << endl;
    	cout << "-------- X --------" << endl;
    	return 0;
    }
    
    vector4.cpp
    #include <iostream>
    #include <vector>
    using namespace std;
    void print (vector<int> const& vi) {
    	cout << "大小:" << vi.size () << endl;
    	cout << "容量:" << vi.capacity () << endl;
    	cout << "元素:" << flush;
    	for (vector<int>::const_iterator it =
    		vi.begin (); it != vi.end (); ++it)
    		cout << *it << ' ';
    	cout << endl;
    }
    int main (void) {
    	vector<int> vi;
    	print (vi);
    	vi.push_back (10);
    	print (vi);
    	vi.push_back (20);
    	print (vi);
    	vi.push_back (30);
    	print (vi);
    	vi.push_back (40);
    	print (vi);
    	vi.push_back (50);
    	print (vi);
    	vi.pop_back ();
    	print (vi);
    	vi.clear ();
    	print (vi);
    	vi.reserve (0);
    	print (vi);
    	vi.reserve (100);
    	print (vi);
    	vi.reserve (10);
    	print (vi);
    	return 0;
    }
    

      

  • 相关阅读:
    iOS 在Host App 与 App Extension 之间发送通知
    将博客搬至CSDN
    ios7 UITableView 分割线在 使用selectedBackgroundView 选中时有些不显示
    UITableViewCell 分割线如何满屏
    CocoaPods管理的项目移植到别人电脑后找不到头文件
    iOS Touch ID 简易开发教程
    iOS内存泄露统计
    iOS开发之Objective-c的AES128加密和解密算法的实现
    iOS中使用RNCryptor对资源文件加密
    iOS持续集成:命令行创建工程
  • 原文地址:https://www.cnblogs.com/kuikuitage/p/9201865.html
Copyright © 2011-2022 走看看