• 4、面向对象



    1.基本的概念

        类,指的是莫一类的事物的概括,是一个抽象的

        对象:指的是某一类里面的一个实体,是具体的

    类:

        通常包含了属性和行为。属性:被描述类的静态的特征,老虎的颜色、体重等静态的属性;行为:描述类的动态特征,比如跑

    类的继承:

        继承之后的类,继承了原先的类的所有的属性和行为;继承之后的类,也可以有自己特有的属性和行为:

                                 d9508e77-2940-4459-9f8f-fc1aef380ce4

        在类A的基础上建立一个新类B,类A成为基类或者父类,类B成为派生类或者子类;子类完全继承父类的所有的成员。

    class 子类名字 : 继承的方式  父类的名字
    {
    }
    继承的方式:public /private/protected,如果省略的话,系统默认的是 private

    2.类的封装

        类的封装就是将不同的属性和行为结合在一起,形成一个新的数据类型。

        成员变量:表示类的属性

        成员函数:表示类的行为的函数,

    分为:共有、私有、保护 三种类型

    公有:成员变量和成员函数可以被类内和外界访问和调用,也就是共有的成员可以通过变量被外接访问

    私有:成员变量和成员函数只能被类的内部访问和调用,也就是说 私有的成员只能在类的内部使用

    3.struct 和 class 区别:

        struct 定义类的时候,所有的成员默认的都是 public

        class定义类的时候,所有的成员默认的都是私有的

    4、构造函数

        构造函数的作用是完成,类的对象初始化,他的名字和类名完全一致,可以有参数,但是必须没有任何的返回值

    class Test
    {
    public:
        Test(int v);  // 构造函数
        ~Test();
        int getValue();
    private:
        int i;
    };
    
    Test::Test(int v)  // 构造函数
    {
        i = v;
    }
    Test::~Test()
    {
    }
    int Test::getValue()
    {
        return i;
    }
    
    int main(int argc, char **argv)
    {
        Test aa(5);  // 对象的初始化
        Test bb = 5; // 对象初始化的方式2
        Test cc = Test(6);  // 主动调用构造函数
        printf("v = %d
    ", aa.getValue());
    }


     

    类的成员函数实现重载:

    C++中函数可以实现函数的重载,构造函数其实也是可以实现重载的功能的:

    class A
    {
    private:
        int i;
    public:
        A()  // 重载
        {
            i = 11;
        }
        A(int v)  // 重载
        {
            i = v;
        }
        int getvalus()
        {
            return i;
        }
    };

    显然,类的对象定义的时候,即使你没有进行初始化,编译器还是会自动完成对象的初始化,

    构造函数的异类

    默认构造函数、拷贝构造函数(完成对象的拷贝的任务)

    A aa;  // 调用默认的构造函数,无参
    
    A bb = aa; // 调用拷贝构造函数

    当类内自己没有定义构造函数和拷贝构造函数的时候,编译器会为你自动添加一个无参的构造函数,其函数体为空。而默认提供的拷贝构造函数,也只是简单的进行成员变量的值复制。

    当类A的对象是类B的成员变量的时候:初试列表的使用

    class A
    {
    private:
        int i;
    public:
        A(int v)
        {
            i = v;
        }
    };
    class  B
    {
    public:
        B() 
        {
            printf("BB
    ");
        }
    private:
        const int c;  // const 变量必须初始化
        A a1;   // 对象也是需要进行初始化
        A a2;
    };

        这个时候,会被报错,因为A的对象在B做成员的变量,压根就没有被初始化,所以在B内部需要给成员变量初始化,初始化列表:

    class  B
    {
    public:
        B() : c(1), a1(2), a2(3) // 构造函数里面,指定初始化的值,初始化列表
        {
            printf("BB
    ");
        }
    private:
        const int c;
        A a1;
        A a2;
    };

        也就是说,通过初始化列表,对成员变量进行初始化,并且初始化列表的执行是先于构造函数的函数体执行的;也就是使用初始化列表对构造函数进行成员变量的初始化,

    5.析构函数

        就是在对象被销毁之前调用的析构函数(完成一些清理的工作),析构函数没有参数,也没有任何的返回值类型

    ~ 类名()
    {
    }

        当自己没有写构造函数或者析构函数的话,编译器会自动为我们添加构造函数和析构函数。

        析构函数当且仅当只有一个。析构执行的调用顺序与对应的构造函数调用秩序相反。

  • 相关阅读:
    WebUploader大文件上传支持分场上传
    WebUploader大文件上传支持切片上传
    WebUploader大文件上传支持分片上传
    ASP.NET大文件上传支持切割上传
    ASP.NET大文件上传支持分场上传
    ASP.NET大文件上传支持切片上传
    ASP.NET大文件上传支持分片上传
    C#大文件上传支持切割上传
    C#大文件上传支持分场上传
    山中何太冷,自古非今年
  • 原文地址:https://www.cnblogs.com/qxj511/p/5215304.html
Copyright © 2020-2023  润新知