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.析构函数

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

~ 类名()
{
}

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

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

原文地址:https://www.cnblogs.com/qxj511/p/5215304.html