C++

C++ 之封装篇(上)

2018-01-29  本文已影响0人  hellobinbin

1、前言

C++的三大特性:封装、继承、多态

封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。

参考学习资料:慕课网 james_yuan 的C++远征系列 之C++远征之 封装篇 。

2、封装概述

数据成员&成员函数

构造函数&析构函数

对象赋值&对象复制

对象数组&对象指针

this指针

3、封装之路

1、类和对象

类的定义:数据成员、成员函数。

类的访问限定符:

public:公共的

protected:受保护的

private:私有的

类的实例化:

//从栈中实例化

clss Teacher{

pubilc:

string m_strName;

string m_strGender;

int m_iAge;

void teach();

};

int main(void){

Teacher tea;  //实例化一个对象

Teacher tea[20];   //实例化一个数组

tea.m_strName = "zhangsan";    //对象成员的访问

// 数组对象成员的访问用for循环

tea.teach();

return 0;

}

//从堆中实例化

int main(){

Teacher *p = new tea();

Teacher *q = new tea[10];

// to do

p->m_strName = "zhangsan";      //对象成员的访问

p->teach();

delete p;    //释放内存

delete []q;

return 0;

}

2、数据的封装

封装的好处:能够对数据进行判断,数据的读写控制。

只读属性只写get函数

class Student{

public:

        void setAge(ing age){

            m_iAge = age;

        }

        int getAge(){

        return m_iAge;

        }

}

private:

    string m_strName;

    string m_strGender;

    int m_iAge;

};

int main(void){

    Student stu;

    stu.m_strName("zhangsan");

    stu.m_strGender("男");

    int m_iAge = 10;

    cout << getName() << "," << getGender() << endl;

    return 0;

}

3、类外定义

前面提到内联函数效率但逻辑简单不能使用for、while循环。

clss Student{

    pubilc:

    inline void setName(string name){

        m_strName = name;

    }

    private:

    string m_strName;

};

类外定义分为同文件类外定义、分文件类外定义。

1、定义类

class Student{

    pubilc:

        void source();

        void study();

    private:

        string m_strName;

        int m_iAge;

};

2、成员函数

void Student::source(){     //需要声明是那个类的成员函数

// to do

}

  void Student::study(){

// to do

}

同文件定义:将1、2写在同一个文件里面

分文件定义:

1命名为Student.h    

2命名为Student.cpp 同时将Student.h包含到头文件里面:#include<Student.h>

分文件定义是我们经常使用的一种定义方法

4、构造函数

内存分区

栈区:定义变量,由系统进行控制。

堆区:new申请内存,使用完需要用delete删除,再用赋值语句NULL设置为空值。

全局区:存储全局变量及静态变量。

常量区:字符串和常量。

代码区:存储编译后的二进制代码。

对象初始化

1.有且仅有一次

2.根据条件初始化

规则和特点

构造函数在对象实例化的时候被自动调用

构造函数与类同名

构造函数没有返回值

构造函数可以有多个重载形式

实例化对象时仅用到一个构造函数

当用户没有定义构造函数时编译器自动生成一个构造函数

//无参构造函数

class Student{

    pubilc:

    Student(){m_strName="Jim";}

    private:

    string m_strName;

};

//有参构造函数

//默认构造函数

Student(string name){m_strName = name;}

初始化列表

class Student {

pubilc:

    Student(): m_strName("Jim"), m_iAge(10){}        //初始化列表

private:

    string m_strName;

    int m_iAge;

}

特点

1.初始化列表只用于构造函数

2.先于构造函数执行

3.可以同时初始化多个成员函数

5、析构函数

归还系统的资源

定义析构函数:    ~类名()

不允许加任何参数!

特点:

如果没有定义一个,系统会自动产生一个。

没有返回值

不能重载

在对象销毁时自动调用

对象的生命历程 

申请内存     >初始化列表     >构造函数     >参与运算     >析构函数     >释放内存

6、附总结图

上一篇下一篇

猜你喜欢

热点阅读