c++ステップアップの準備(一)


文書ディレクトリ
  • 1親入力子プロセス
  • 2異常捕獲
  • 3構造体と関数コールバック
  • 4動的配列
  • 5テンプレート
  • 6類テンプレート
  • 7容器vector
  • 8入れ子容器
  • 9 new
  • 10リファレンス&
  • 10.1ポインタ定数
  • 10.2定数参照
  • 11関数
  • 11.1関数リロード
  • 12パッケージ継承マルチステート
  • 12.1コピーコンストラクタ
  • 12.2浅いコピー深いコピー
  • 13初期化リスト
  • 14 this
  • 15友元
  • 16演算子リロード
  • 17マルチステート
  • 17.1多態原理
  • 18純虚関数抽象クラス
  • 19虚析純虚析
  • 20テンプレートファイル作成


  • Linuxシステムプログラミング
    c/c++プログラミング
    1親プロセス
    #include 
    #include 
    
    int main()
    {
         
        int pid;
        pid = fork();
        if (pid==-1)
        {
         
            printf("error
    "
    ); } if (pid == 0) printf("child: my = %d, parent = %d
    "
    , getpid(), getppid()); //getpid() pid,getppid() pid else printf("parent: my = %d, child = %d
    "
    , getpid(), pid); return 0; }/* fork , ,fork PID fork , ,fork 0*/

    2異常捕捉
    #include
    
    using namespace std;
    
    class MyClass
    {
    	//  
    };
    
    class myclass :public MyClass {
    
    	//   
    };
    /*   try catch  */
    //          ,    
    //int main() {
    //
    //	try
    //	{
    //		throw MyClass();
    //	}
    //	
    //	catch (myclass) {
    //
    //		cout << "myclass   " << endl;
    //	}
    //	catch (MyClass)
    //	{
    //		cout << "Myclass  " << endl;
    //	}
    //	return 0;
    //}
    int main() {
    
    	try
    	{
    		throw myclass();//    
    	}
    	//    
    	catch (MyClass)
    	{
    		cout << "Myclass  " << endl;
    	}
    	catch (myclass) {
    
    		cout << "myclass   " << endl;
    	}
    	
    	return 0;
    }//      
    /*
    catch (MyClass)
    	{
    		cout << "Myclass  " << endl;
    	}
    	*/
    

    3構造体と関数コールバック
    #include 
    #include 
    #include 
    
    struct dynamicArray
    {
         
    	void** addr2;
    	//        
    	void* addr1;
    	//        
    };
    void test2() {
         
    
    	struct dynamicArray* addr = malloc(sizeof(struct dynamicArray));
    
    	addr->addr2 = malloc(sizeof(void*) * 5);
    
    	printf("
    2-----------------------%d
    "
    , addr); // addr->addr2[3] = 1; addr->addr2[4] = 2; printf("%d
    "
    , addr->addr2[3]); printf("%d
    "
    , addr->addr2[4]); } void test1() { struct dynamicArray* addr = malloc(sizeof(struct dynamicArray)); addr->addr1 = malloc(sizeof(void*) * 5); printf("1-----------------------%d
    "
    , addr); // addr->addr1 = 1; printf("%d
    "
    , addr->addr1); } // // void back_func_test(void* back_func(void*,void*)) { int* x; int y = 10; x = &y; back_func(*x,*x+10); } // , , // void back1(void *data1,void *data2) { // *x printf("%d
    "
    , data1); //printf("%d
    ", data2);
    } void back2(void* data1, void* data2) { // *x,*x+10 printf("%d
    "
    , data1); printf("%d
    "
    , data2); } int main() { /*test1(); test2();*/ printf(" 1
    "
    ); back_func_test(back1); printf(" 2
    "
    ); back_func_test(back2); return 0; }

    4動的配列
    #include 
    #include 
    #include 
    #include 
    
    struct dynamicArray
    {
         
    	void** addr;
    	//       
    
    	int capacity;
    	//    
    
    	int Size;
    	//    
    };
    //     
    struct dynamicArray* initArray(int Capacity) {
         
    
    	if (Capacity <= 0) {
         
    		return;
    
    	}
    	struct dynamicArray* arr = malloc(sizeof(struct dynamicArray));
    	//       
    	if (arr)
    	{
         	
    		//arr   
    		
    		arr->capacity = Capacity;
    		arr->Size = 0;
    		arr->addr = malloc(sizeof(void*) * Capacity);
    	}
    	else
    	{
         
    		printf("fail
    "
    ); return; } return arr; } // (data) (arr) (pos) void insertArray(struct dynamicArray* arr, int pos, void* data) { if (arr) { if (pos<0 || pos>arr->Size) { // , pos = arr->Size; } } if (data == NULL) { } if (arr) { if (arr->capacity == arr->Size) { // , int newCapacity = arr->capacity * 2; void** newSpace = malloc(sizeof(void*) * newCapacity); // , if (newSpace) { memcpy(newSpace, arr->addr, sizeof(void*) * arr->capacity); // free(arr->addr); // arr->addr = newSpace; arr->capacity = newCapacity; // } } // for (int i = arr->Size - 1; i >= pos; i--) { arr->addr[i + 1] = arr->addr[i]; } arr->addr[pos] = data; arr->Size++;// } } // void foreachArray(struct dynamicArray* arr,void(*myprint)(void*)){ if (arr==NULL) { } if (myprint==NULL) { } for (int i = 0; i < arr->Size; i++) { myprint(arr->addr[i]); } } // void delArray(struct dynamicArray* arr,int pos) { if (arr) { } if (pos<0||pos>arr->Size-1) { return; } for (int i = pos; i < arr->Size-1; i++) { arr->addr[i] = arr->addr[i + 1]; } arr->Size--; } // void delvalueArray(struct dynamicArray* arr, void* data,int(*myCompare(void*,void*))) { if (arr==NULL) { } if (data==NULL) { } for (int i = 0; i < arr->Size-1; i++) { if (myCompare(arr->addr[i],data)) { delArray(arr, i); break; } } } struct Person { char name[32]; int age; }; // void myprint(void* data) { struct Person* p = data; printf("%s %d
    "
    , p->name, p->age); } int myCompare(void* data1, void* data2) { struct Person *p1 = data1; struct Person *p2 = data2;// return strcmp(p1->name,p2->name)==0 && (p1->age == p2->age); } // void desArray(struct dynamicArray* arr) { if (arr==NULL) { } // , if (arr->addr!=NULL) { free(arr->addr); arr->addr = NULL; } free(arr); arr = NULL; printf("end
    "
    ); } void test01() { struct dynamicArray* ARR=initArray(5); // struct Person p1 = { "yi",20 }; struct Person p2 = { "er",20 }; struct Person p3 = { "san",20 }; struct Person p4 = { "si",20 }; struct Person p5 = { "wu",20 }; struct Person p6 = { "liu",20 }; // printf("
    ----%d %d
    "
    , ARR->capacity, ARR->Size); insertArray(ARR, 0, &p1); insertArray(ARR, 1, &p2); insertArray(ARR, 2, &p3); insertArray(ARR, -1, &p4); insertArray(ARR, 3, &p5); insertArray(ARR, 4, &p6); // printf("
    ----%d %d
    "
    , ARR->capacity, ARR->Size); foreachArray(ARR, myprint); delArray(ARR, 1);// “1” printf("--------------------
    "
    ); foreachArray(ARR, myprint); printf("--------------------
    "
    ); struct Person p = { "san",20 }; delvalueArray(ARR,&p,myCompare); foreachArray(ARR, myprint); desArray(ARR); } int main() { int a[32] = { 0 }; test01(); }

    5テンプレート
    #include
    using namespace std;
    //        
    /*
    template         (    ,...){
    
    	//   
    }
    */
    // template    
    // <>       (  )
    //			1.    (class / typedef)
    //			2.     (     )
    // Type   int double
    template  
    Type max_us(Type x, Type y) {
    
    
    	return x > y ? x : y;
    }
    
    //    
    template 
    
    Type max_arr(Type arr[len]) {
    
    	Type ret = arr[0];
    	for (int i = 1; i < len; i++)
    	{
    		ret = (arr[i] > ret ? arr[i] : ret);
    	}
    	return ret;
    }
    //      ,    、     
    char* max_us(char* a, char* b) {
    
    	
    	if (strcmp(a,b))
    	{
    		return a;
    	}
    	else
    	{
    		return b;
    	}
    }
    //   
    
    int main() {
    	
    	int i = max_us(8, 9);
    	double j = max_us(9.1, 10.9);
    	
    	//  
    	//      
    	float k = max_us(8.1f, 3);
    
    	cout << i << endl;
    	cout << j << endl;
    	cout << k << endl;
    	int a[5] = { 1,4,2,9,6 };
    
    	//      
    	int max_a = max_arr(a);
    	cout << max_a << endl;
    
    	cout << "    " << endl;
    	cout << max_us('a', 'n') << endl;
    	cout << max_us(9, 10) << endl;
    
    	cout << "end" << endl;
    	return 0;
    
    }
    

    6種類のテンプレート
    #include
    using namespace std;
    /*
             
    template  class     
    {
    	//   
    }
    
               
    template 
              ::     (      )
    {
    	//   
    }
    
                              ,
               ,       ,      
         
    
                
             
    */
    
    template 
    class Container
    {
    	Type u;
    public:
    	
    	void begin2(const Type& itnew);//    
    };
    
    template  void Container::begin2(const Type& p) {
    	//    
    	u = p;
    	cout << u << endl;
    }
    int main() {
    	Container myContainer;//    
    	
    	int i = 100;
    	myContainer.begin2(i);
    	
    }
    

    7容器vector
    #include
    
    #include
    
    #include
    #include
    using namespace std;
    
    //vector   (       )
    class person {
    public:
    
    	person(string name, int age) {
    
    		this->name = name;
    		this->age = age;
    	}
    	
    	string name;
    	int age;
    
    };
    void test02() {
    	vector vp;
    
    	person p1("a", 10);
    	person p2("b", 20);
    	person p3("c", 30);
    	//       
    	vp.push_back(p1);
    	vp.push_back(p2);
    	vp.push_back(p3);
    	//    
    	for (vector::iterator it = vp.begin(); it!= vp.end(); it++) {
    
    		cout << (*it).name << endl;
    		cout << (*it).age << endl;
    		//cout << it->name << endl;
    		
    	}
    
    }
    void test03() {
    	vector vp;
    
    	person p1("a", 10);
    	person p2("b", 20);
    	person p3("c", 30);
    	//       
    	vp.push_back(&p1);
    	vp.push_back(&p2);
    	vp.push_back(&p3);
    	//    
    	for (vector::iterator it = vp.begin(); it != vp.end(); it++) {
    
    		cout << (*it)->name << endl;
    		cout << (*it)->age << endl;
    		
    	}
    
    }
    
    //vector   (  )
    void myprint(int val)
    {
    	cout << val << endl;
    }
    void test01() {
    	//          varray
    	vector varray;
    
    	varray.push_back(10);//        
    	varray.push_back(90);
    	varray.push_back(19);
    	//            
    	vector::iterator itbegin = varray.begin();
    	//         
    	vector::iterator itend = varray.end();
    	//                
    
    	while (itbegin!=itend)
    	{
    		cout << *itbegin << endl;
    		itbegin++;
    	}
    	//  2
    	for (vector::iterator it = varray.begin(); it != varray.end(); it++) {
    
    		cout << *it << endl;
    	}
    	//  3
    	for_each (varray.begin(), varray.end(), myprint);
    	
    }
    int main() {
    
    	//test01();
    	/*test02();*/
    	test03();
    	cout << "----------------" << endl;
    }
    

    8ネストされたコンテナ
    #include
    
    #include
    
    #include
    #include
    using namespace std;
    
    void test01() {
    
    	//    
    	vector> vv;
    
    	vector v1;
    	vector v2;
    	vector v3;
    	for (int i = 0; i < 3; i++)
    	{
    		v1.push_back(i + 2);
    		v2.push_back(i + 3);
    		v3.push_back(i + 4);
    		//          
    	}
    	vv.push_back(v1);
    	vv.push_back(v2);
    	vv.push_back(v3);
    	//        
    	for (vector> ::iterator it=vv.begin();it!=vv.end(); it++){
    		//     
    
    		for (vector::iterator vit = (*it).begin();vit!=(*it).end(); vit++)
    		{
    			//     
    			cout << "  "<

    9 new
    #include
    using namespace std;
    void fun() {
    
    	int* p = new int(10);
    	//p      ,   10
    	cout << *p << endl;
    	delete p;
    	p = NULL;
    
    }
    void funarr() {
    
    	int* p1 = new int[10];
    	//p      ,   10
    	for (int i = 0; i < 10; i++)
    	{
    		p1[i] = i + 100;
    	}
    	for (int i = 0; i < 10; i++)
    	{
    		cout << p1[i] << endl;
    
    	}
    	//    (       [])
    	delete[]p1;
    	p1 = NULL;
    
    }
    int main() {
    
    	fun();
    	cout << "-------------" << endl;
    
    	funarr();
    	
    	return 0;
    }
    

    10参照&
    10.1ポインタ定数
    参照の本質はポインタ定数です.
    #include
    
    using namespace std;
    /*
    	     &  =  
    
    */
    //       
    void swap(int &a,int &b) {
    	int temp;
    	temp = a;
    	a = b;
    	b = temp;
    	cout << "A=" << a << " B=" << b << endl;
    }
    //        
    
    int& test01() {
    
    	int a = 10;
    	return a;
    
    }
    int& test02() {
    
    	static int a = 16;//     
    
    	return a;
    }
    int global = 190;//
    
    int& test03() {
    
    	return global;
    }
    int main() {
    
    	int a=1;
    	int b = 9;
    	//    
    	int& A = a;//       
    
    	//int& A = b;//          (   a   )
    	cout << A << endl;
    
    	int a1 = 10;
    	int b1 = 18;
    	swap(a1, b1);//                
    	cout << "-----------------" << endl;
    	int& ref = test01();
    	cout << ref << endl;
    	cout << ref << endl;
    	//      ,    ,        ,          
    	cout << "-----------------" << endl;
    	int gl = test03();
    	cout << gl << endl;
    	cout << gl << endl;//    
    
    	cout << "-----------------" << endl;
    	int& ref02 = test02();
    	cout << ref02 << endl;
    	cout << ref02 << endl;
    
    	test02() = 1000;//          ,      [  ]
    	cout << ref02 << endl;
    	cout << ref02 << endl;
    	cout << "-----------------" << endl;
    	int e = 10;
    	int e2 = 1;
    
    	int* const f = &e;//    ,     ,      
    	cout << *f << endl;
    	cout << "-----------------" << endl;
    	const int* f2 = &e;//    ,     ,     
    	cout << *f2 << endl;
    	f2 = &e2;
    	cout << *f2 << endl;
    	return 0;
    }
    

    10.2定数参照
    #include
    
    using namespace std;
    
    void test01(const int& a) {
    
    	//    ,    ,     
    	//a = 100;//  ,    
    	cout << a << endl;
    }
    
    int main() {
    
    	int a = 11;
    
    	//int& b = 10;//  
    	const int& b = 10;
    
    	test01(a);
    
    	return 0;
    }
    

    11関数
    #include
    
    using namespace std;
    void test01(int a, int b, int c = 10);
    //        ,          
    void test01(int a,int b,int c) {
    
    	int sum;
    	sum = a + b + c;
    
    	cout << sum << endl;
    
    }
    //      
    //       
    void test02(int a,int =10) {
    
    	cout <

    11.1関数の再ロード
    #include
    
    using namespace std;
    
    void func(int& a) {
    	cout << "int& a" << endl;
    }
    void func(const int& a) {
    	cout << "const int& a" << endl;
    }
    int main() {
    
    	int a = 10;
    
    	func(a);
    
    	func(1);
    	return 0;
    }
    

    12パッケージ継承マルチステート
    12.1コピーコンストラクタ
    #include
    
    using namespace std;
    
    //      
    
    class Person {
    
    public:
    	
    	Person(int age) {
    
    		this->cage = age;
    		cout << this->cage << endl;
    	}
    	Person(const Person& p) {
    		//      
    		this->cage = p.cage;
    		cout << this->cage << endl;
    		cout << "      " << endl;
    	}
    	~Person() {
    		//    
    		cout << "    " << endl;
    	}
    
    private:
    	int cage;
    };
    
    void test01() {
    	//                 
    	Person p1(20);
    	Person p2(p1);
    }
    void test02(Person p) {
    
    }
    int main() {
    
    	test01();
    	
    	return 0;
    }
    

    12.2浅いコピーと深いコピー
    #include
    using namespace std;
    class MyClass
    {
    public:
    	int cage;
    	int *cheight;
    	//      
    	MyClass(int age,int height) {
    
    		this->cheight = new int(height);
    		//      
    		this->cage = age;
    	}
    	MyClass(const MyClass& p) {
    		//      
    		cage = p.cage;
    		//cheight=p.cheight;//       
    		cheight = new int(*p.cheight);
    	}
    	/*              。
    	*     :      ,       。
    	*       ,   p1  p1 *cheight      ,
    	*     p,  p *cheight        ,    
    	* p									p1
    	* 【cage】							 【cage】 
    	* 【*cheight】\					/【*cheight】 
    	*				【     】
    	*/
    	/*   
    	* p									p1
    	* 【cage】							 【cage】
    	* 【*cheight】\					 【*cheight】\
    	*				【     】					【     】
    	*/
    	~MyClass();
    };
    
    MyClass::~MyClass()
    {
    	if (cheight!=NULL)
    	{
    		delete cheight;
    		cheight = NULL;
    		
    	}
    	cout << "    " << endl;
    	cout << cheight << endl;
    	
    }
    void test01() {
    	MyClass p(10,99);
    	MyClass p1(p);//          
    	std::cout << p.cage << " "<

    13初期化リスト
    14 this
    15友元
    16演算子の再ロード
    既存の演算子を定義し、新しい機能に割り当て、新しいタイプに適応します.
    #include
    
    using namespace std;
    
    class Person {
    
    public:
    	//      + 
    	
    	Person operator+(Person& p) {
    		Person temp;
    		temp.age = this->age + p.age;
    
    		temp.height = this->height + p.height;
    
    		return temp;
    	}
    	int age;
    	int height;
    };
    //      + 
    //Person operator+ (Person& p1,Person& p2) {
    //	Person temp;
    //	temp.age = p1.age + p2.age;
    //	temp.height = p1.height + p2.height;
    //
    //	return temp;
    //}
    void test01() {
    	Person test;
    	Person p1;
    	p1.age = 10;
    	p1.height = 99;
    	Person p2;
    	p2.age = 11;
    	p2.height = 100;
    
    	test = p1 + p2;
    	cout << test.age << " " << test.height << endl;
    
    }
    int main() {
    	test01();//            。
        /*
            
    
    Person p3=p1.operator+(p2);
    
            
    
    Person p3=operator+(p1,p2);
    */
    	return 0;
    }
    
    #include
    
    using namespace std;
    class Person {
    
    public:
    	int operator()(int a, int b){
    
    		return a + b;
    	}
    };
    void test01() {
    	int a = 9;
    	int b = 10;
    	int temp;
    	Person p;
    	temp=p(a, b);//  (),   
    
    	cout<

    17マルチステート
    静的(関数リロード、演算子リロード)、動的(派生クラス、虚関数).
    #include
    
    using namespace std;
    class Animal {
    
    public:
    	/*void speak1() {
    		cout << "  speak" << endl;
    	}*/
    	//   
    	virtual void speak1() {
    		cout << "  speak" << endl;
    	}
    };//  
    //      
    class cat :public Animal {
    
    public:
    	void speak1() {
    
    		cout << " speak" << endl;
    	}
    };
    class dog :public Animal {
    
    public://         
    	//  :   、   、      
    	void speak1() {
    
    		cout << " speak" << endl;
    	}
    };
    void dospeak(Animal& animal) {
    
    	animal.speak1();
    }
    int main() {
    	//  :          
    	cat c1;
    	dospeak(c1);//     ,        
    	//               ,        
    	/*
    	*     :
    	*      
    	*          
    	*     :
    	*        ,     
    	*/
    	dog d1;
    	dospeak(d1);//       ,     
    	return 0;
    }
    

    17.1多態原理
    親クラスの虚関数では、虚関数はポインタに似ており、虚関数テーブルを指します.子クラスが親クラスを継承すると、虚関数テーブルが再コピーされるので、子クラスで虚関数を書き換え、指向を変更します.
    18純虚関数抽象クラス
    #include
    
    using namespace std;
    
    class Person {
    
    public:
    	virtual void func()=0;
    	//    
    	//              
    	//        
    	//             (  )     
    };
    
    class Son :public Person{
    
    	virtual void func() {
    
    		cout << "Son  " << endl;
    		//             (  )     ,       
    	}
    };
    int main() {
    	//Person p;
    	//new Person;//        
    	Person* p = new Son;
    	/*
    	*             ,new       ,      
    	*/
    	p->func();
    	return 0;
    }
    

    19虚析構造純虚析構造
    #include
    #include
    using namespace std;
    //                   
    class Person {
    public:
    	Person() {
    
    		cout<speak1();
    	//         ,          ,           
    	// :son       (~son6()   )
    	//  :         
    	delete p;
    	//  
    
    }
    int main() {
    	
    	test01();//  
    	return 0;
    }
    

    純粋な虚析構造は実現する必要がある
    20テンプレートファイル作成
    .hpp .cpp
    #pragma once
    #include
    #include
    //        
    using namespace std;
    //   
    template
    
    class Person {
    
    public:
    	Person(T1 name, T2 age);
    
    	void showPerson();//        
    	T1 mname;
    	T2 mage;
    };
    /*----------------------------------------*/
    template
    Person::Person(T1 name, T2 age) {
    
    	this->mname = name;
    	this->mage = age;//      
    }
    /*----------------------------------------*/
    template
    void Person::showPerson() {
    
    	//        
    	cout << "  :" << this->mname << " " << this->mage << endl;
    }
    /*-------------------------------------
    
    #include"practice.hpp"
    int main() {
    
    	Person obj("Tom", 10);
    
    	obj.showPerson();
    
    	return 0;
    }