zoukankan      html  css  js  c++  java
  • 大四中软实习笔记20130228

    1 访问权限
    public:
      当前的成员变量和成员函数,可以被本类/它类的的成员函数、外部函数(包括main函数和自定义函数)来调用
    private:
      当前的成员变量和成员函数,只能被本类的成员函数来调用
    protected;
      当前的成员变量和成员函数,只能被本类/派生类的成员函数来调用
     
     


    2 初始化表
    当需要调用它类的构造函数时,考虑使用(如果不使用,就需要使用普通的公共成员函数)
    使用方法:
        在函数原型的后面,添加初始化表语句(注意,在类的声明中不能加初始化表语句)
    原因:
        构造函数不能被显示调用,只能在定义对象时自动调用(包括无参构造函数和有参构造函数)   


    #include <stdio.h>
    #include <string.h>
    class score
    {
    private:
        int math;
        int english;
    public:
        score();
        score(int mat,int eng);
        void print();
    };

    score:: score()
    {
        math=100;
        english=100;
        printf("score的无参构造函数被调用了\n");
    }

    score:: score(int mat,int eng)
    {
        math=mat;
        english=eng;
        printf("score的有参构造函数被调用了\n");
    }

    void score::print()
    {
        printf("math is %d\tenglish is %d\n",math,english);
        return;
    }


    class student
    {
    public:
        int number;
        char *name;
        int age;
        score chengji;
        void print();
        student & operator=(student &other);
        student();
        student(int num,char *nam,int ag,int mat,int eng);
        student(student &other);
        ~student();
    };

    student:: student()
    {
        number=0;
        name=new char[1];
        strcpy(name,"");
        //chengji.math=100;
        //chengji.english=100;
        //score(100,100);
        age=0;
    }

    student:: student(student &other)
    {
        number=other.number;
        name=new char[strlen(other.name)+1];
        strcpy(name,other.name);
        age=other.age;

    }

    student & student:: operator=(student &other)
    {
        if(this==&other)
            return *this;
        number=other.number;
        char *namebak=name;
        name=new char[strlen(other.name)+1];
        strcpy(name,other.name);
        age=other.age;
        delete []namebak;
        return *this;
    }

    student:: ~student()
    {
        printf("开始析构了\n");
        delete []name;
    }

    student:: student(int num,char *nam,int ag,int mat,int eng):chengji(mat,eng)
    {
        number=num;
        name=new char[strlen(nam)+1];
        strcpy(name,nam);
        age=ag;
        //chengji.math=mat;
        //chengji.english=eng;
        //socre(mat,eng);
    }

    void student:: print()
    {
        printf("%d\t%s\t%d\n",number,name,age);   
        chengji.print();
        return;
    }

    int main()
    {
        //student stu1(1001,"zhangsan",21);
        //student stu2(1002,"lisi",22);
        //student stu3(1003,"wangwu",23);
        //stu3=stu2=stu1;
        //stu3.operator=(stu2);

        //stu3.print();

        student stu21(3001,"chuanda",32,91,92);
        stu21.print();


        return 0;
    }

    2 new的另外的用法
    score *chengji=new score; //自动调用类的构造函数初始化。
    score *chengji=new score(81,82);

    score *chengji=new score[1];
    score *chengji=new score[1](81,82);//编译失败
    score *chengji=new score[2](81,82);//编译失败
    为什么一定要定义类的无参构造函数?
    原因:否则,无法使用new score[2]这样的用法

    3 类和类之间的关系
    3.1 UML中的解释
    class student
    {
    public:
        int number;
        char *name;
        int age;
        score *chengji;
        void print();
        student & operator=(student &other);
        student();
        student(int num,char *nam,int ag,int mat,int eng);
        student(student &other);
        ~student();
    };
    本例1中:student和score是聚合关系


    class student
    {
    public:
        int number;
        char *name;
        int age;
        score chengji;
        void print();
        student & operator=(student &other);
        student();
        student(int num,char *nam,int ag,int mat,int eng);
        student(student &other);
        ~student();
    };
    本例2中:student和score是组合关系

    聚合、组合都属于关联 关系。它们是关联的2个特例


    3.2 在很多程序员当中这样解释
    本例1中:student和score是关联关系
    本例2中:student和score是组合关系

    1 自由组合
    7-9人
    2 选项目
      2个组可以有相同的
    3 组长选好
    4 人员分为ABC
    5 项目要真实的
    6 项目要重视质量---健壮性 

    4 继承关系
    代码;

    #include <stdio.h>
    #include <string.h>
    class student
    {
    private:
        int number;
        char *name;
        int age;
    public:
        void print();
        student & operator=(student &other);
        student();
        student(int num,char *nam,int ag);
        student(student &other);
        ~student();
    };

    student:: student()
    {
        number=0;
        name=new char[1];
        strcpy(name,"");
        age=0;       
    }

    student:: student(student &other)
    {
        number=other.number;
        name=new char[strlen(other.name)+1];
        strcpy(name,other.name);
        age=other.age;
    }

    student & student:: operator=(student &other)
    {
        if(this==&other)
            return *this;
        number=other.number;
        char *namebak=name;
        name=new char[strlen(other.name)+1];
        strcpy(name,other.name);
        age=other.age;
        delete []namebak;
        return *this;
    }

    student:: ~student()
    {
        printf("student开始析构了\n");
        delete []name;
    }

    student:: student(int num,char *nam,int ag):number(num),age(ag)
    {
        //number=num;
        name=new char[strlen(nam)+1];
        strcpy(name,nam);
    }

    void student:: print()
    {
        printf("%d\t%s\t%d\n",number,name,age);   
        return;
    }


    class student_college:public student
    {
    private:
        char * name_college;
        char * name_prof;
        int count_persons;
    public:
        student_college();
        ~student_college();
    };

    student_college::student_college()
    {
        name_college=new char;
        name_prof=new char;
        strcpy(name_college,"");
        strcpy(name_prof,"");
        count_persons=0;
       
    }

    student_college::~student_college()
    {
        delete []name_college;
        delete []name_prof;
    }


    int main()
    {
        student_college stu_col;   

        return 0;
    }

    代码2:
    #include <stdio.h>
    #include <string.h>
    class student
    {
    private:
        int number;
        char *name;
        int age;
    public:
        void print();
        student & operator=(student &other);
        student();
        student(int num,char *nam,int ag);
        student(student &other);
        ~student();
    };

    student:: student()
    {
        number=0;
        name=new char[1];
        strcpy(name,"");
        age=0;   
        printf("学生类的无参构造函数被调用\n");
    }

    student:: student(student &other)
    {
        number=other.number;
        name=new char[strlen(other.name)+1];
        strcpy(name,other.name);
        age=other.age;
    }

    student & student:: operator=(student &other)
    {
        if(this==&other)
            return *this;
        number=other.number;
        char *namebak=name;
        name=new char[strlen(other.name)+1];
        strcpy(name,other.name);
        age=other.age;
        delete []namebak;
        return *this;
    }

    student:: ~student()
    {
        printf("student开始析构了\n");
        delete []name;
    }

    student:: student(int num,char *nam,int ag):number(num),age(ag)
    {
        //number=num;
        name=new char[strlen(nam)+1];
        strcpy(name,nam);
    }

    void student:: print()
    {
        printf("%d\t%s\t%d\n",number,name,age);   
        return;
    }


    class student_college:public student
    {
    private:
        char * name_college;
        char * name_prof;
        int count_persons;
    public:
        student_college();
        ~student_college();
    };

    student_college::student_college()
    {
        name_college=new char;
        name_prof=new char;
        strcpy(name_college,"");
        strcpy(name_prof,"");
        count_persons=0;
        printf("大学生的无参构造函数被调用\n");
    }

    student_college::~student_college()
    {
        delete []name_college;
        delete []name_prof;
        printf("大学生的析构函数被调用\n");
    }


    int main()
    {
        student_college *stu_col=new student_college;   
        delete stu_col;

        return 0;
    }

    注意点:
    1 使用new建立的对象,也必须使用delete来销毁。
    如果,不delete,则会内存泄露。(析构函数不会被自动调用)
    2 析构函数前面都要加virtual
    原因:使用多态特性的时候,如果基类的析构函数前面没有virtual,则可能导致析构不全的问题。


    代码3:
    #include <stdio.h>
    #include <string.h>
    class student
    {
    private:
        int number;
        char *name;
        int age;
    public:
        void print();
        student & operator=(student &other);
        student();
        student(int num,char *nam,int ag);
        student(student &other);
        virtual ~student();
    };

    student:: student()
    {
        number=0;
        name=new char[1];
        strcpy(name,"");
        age=0;   
        printf("学生类的无参构造函数被调用\n");
    }

    student:: student(student &other)
    {
        number=other.number;
        name=new char[strlen(other.name)+1];
        strcpy(name,other.name);
        age=other.age;
    }

    student & student:: operator=(student &other)
    {
        if(this==&other)
            return *this;
        number=other.number;
        char *namebak=name;
        name=new char[strlen(other.name)+1];
        strcpy(name,other.name);
        age=other.age;
        delete []namebak;
        return *this;
    }

    student:: ~student()
    {
        printf("student开始析构了\n");
        delete []name;
    }

    student:: student(int num,char *nam,int ag):number(num),age(ag)
    {
        //number=num;
        name=new char[strlen(nam)+1];
        strcpy(name,nam);
        printf("学生类的有参构造函数被调用\n");
    }

    void student:: print()
    {
        printf("%d\t%s\t%d\n",number,name,age);   
        return;
    }


    class student_college:public student
    {
    private:
        char * name_college;
        char * name_prof;
        int count_persons;
    public:
        student_college();
        student_college(int num,char *nam,int ag,char *name_col,char *name_pro,int count_per);
        virtual ~student_college();
        void print();
    };

    student_college::student_college()
    {
        name_college=new char;
        name_prof=new char;
        strcpy(name_college,"");
        strcpy(name_prof,"");
        count_persons=0;
        printf("大学生的无参构造函数被调用\n");
    }

    student_college:: student_college(int num,char *nam,int ag,char *name_col,char *name_pro,int count_per):student(num,nam,ag)
    {
        name_college=new char[strlen(name_col)+1];
        name_prof=new char[strlen(name_pro)+1];
        strcpy(name_college,name_col);
        strcpy(name_prof,name_pro);
        count_persons=count_per;
        printf("大学生的有参构造函数被调用\n");

    }

    student_college::~student_college()
    {
        delete []name_college;
        delete []name_prof;
        printf("大学生的析构函数被调用\n");
    }

    void student_college:: print()
    {
        printf("%s\t%s\t%d\n",name_college,name_prof,count_persons);
        student::print();
        return ;
    }


    int main()
    {
        //student_college *stu_col=new student_college;   
        student_college stu1(1001,"zhangsan",22,"chongda","jike",56);
        stu1.print();
        return 0;
    }
    注意点:
    1 调用基类的有参构造函数时,需要在派生类有参构造函数的后面,使用初始化表,进行显式调用
    2 派生类的成员函数,如果要调用基类的成员函数,要加(基类的)作用域。(如果不同名,则可以省略)


    5 多态
    代码:
    #include <stdio.h>
    #include <string.h>
    class student
    {
    private:
        int number;
        char *name;
        int age;
    public:
        void print();
        student & operator=(student &other);
        student();
        student(int num,char *nam,int ag);
        student(student &other);
        virtual ~student();
        virtual void fun();
    };
    void student:: fun()
    {
        printf("student_fun()\n");
        return;
    }

    student:: student()
    {
        number=0;
        name=new char[1];
        strcpy(name,"");
        age=0;   
        printf("学生类的无参构造函数被调用\n");
    }

    student:: student(student &other)
    {
        number=other.number;
        name=new char[strlen(other.name)+1];
        strcpy(name,other.name);
        age=other.age;
    }

    student & student:: operator=(student &other)
    {
        if(this==&other)
            return *this;
        number=other.number;
        char *namebak=name;
        name=new char[strlen(other.name)+1];
        strcpy(name,other.name);
        age=other.age;
        delete []namebak;
        return *this;
    }

    student:: ~student()
    {
        printf("student开始析构了\n");
        delete []name;
    }

    student:: student(int num,char *nam,int ag):number(num),age(ag)
    {
        //number=num;
        name=new char[strlen(nam)+1];
        strcpy(name,nam);
        printf("学生类的有参构造函数被调用\n");
    }

    void student:: print()
    {
        printf("%d\t%s\t%d\n",number,name,age);   
        return;
    }


    class student_college:public student
    {
    private:
        char * name_college;
        char * name_prof;
        int count_persons;
    public:
        student_college();
        student_college(int num,char *nam,int ag,char *name_col,char *name_pro,int count_per);
        virtual ~student_college();
        void print();
        virtual void fun();
    };
    void student_college:: fun()
    {
        printf("student_college_fun()\n");
        return;
    }


    student_college::student_college()
    {
        name_college=new char;
        name_prof=new char;
        strcpy(name_college,"");
        strcpy(name_prof,"");
        count_persons=0;
        printf("大学生的无参构造函数被调用\n");
    }

    student_college:: student_college(int num,char *nam,int ag,char *name_col,char *name_pro,int count_per):student(num,nam,ag)
    {
        name_college=new char[strlen(name_col)+1];
        name_prof=new char[strlen(name_pro)+1];
        strcpy(name_college,name_col);
        strcpy(name_prof,name_pro);
        count_persons=count_per;
        printf("大学生的有参构造函数被调用\n");

    }

    student_college::~student_college()
    {
        delete []name_college;
        delete []name_prof;
        printf("大学生的析构函数被调用\n");
    }

    void student_college:: print()
    {
        printf("%s\t%s\t%d\n",name_college,name_prof,count_persons);
        student::print();
        return ;
    }


    int main()
    {
        student *stu_col=new student_college;
        stu_col->fun();
        return 0;
    }

    注意点:
    1 使用基类的地址变量来实现多态
    2 基类和派生类的函数,成员函数原型一致,而且前面要加virtual。
    3 其它情况不存在多态的问题。


    6
    虚函数
    纯虚函数   =0     无定义
    抽象类  只要有1个成员函数是纯虚函数     不能实例化(不能建立 对象)    只用来派生
    实例类 可以进行实例化

    7
    多组合
    多聚合

  • 相关阅读:
    AJAX 验证用户名是否存在
    字符串变量中保存路径
    hdu Kaitou Kid The Phantom Thief (2)
    hdu 连连看
    hdu Sequence one
    hdu Sticks
    hdu Nightmare
    hdu Sudoku Killer
    hdu Dota all stars
    hdu Remainder
  • 原文地址:https://www.cnblogs.com/blueswitkey/p/2943771.html
Copyright © 2011-2022 走看看