十二、类与对象

对象:就是我们生活中的具体事物,看得见摸得到,有一定的属性和行为或操作方式

面向对象:是一种软件的开发方法,对象所指的是计算机系统中的某一个成分。在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。对象则是数据和动作的结合体。对象不仅能够进行操作,同时还能够及时记录下操作结果

面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)的主要思想是把构成问题的各部分分解成各个对象,建立对象的目的是为了描叙一个事物在整个解决问题的步骤中的行为。面向对象程序设计中的概念主要包括:对象、类、数据抽象、继承、动态绑定、数据封装、多态性、消息传递。通过这些概念面向对象的思想得到了具体的体现。

其实就是一个对象,属于用户自己定义的数据类型,一个类也包含两部分类的属性和类的方法,类的方法也就是类的行为,实际上也就是类中封装的函数

类还分为基类和派生类

基类就是类对象固有的一些基本属性

派生类是属于类特有或延伸出来的属性

例如:人就是一个类,那么人的姓名、年龄等属于固有属性,这就是人的基类

           吃饭、睡觉这属于行为或者说方法

           那么有的人可能是学生,他还有学号、班级等特性是基类所没有的,这就是人的派生类

 十三、类的定义和实例化

1、类的一般语法形式

class 类名:继承方式 基类, ...{

访问控制限定符:

        类名(形参表);初始化列表{...} //构造函数

        ~类名(void){...}//析构函数

        返回类型 函数名(形参表){...}//成员函数

        数据类型 变量名;//成员变量

};

2、访问控制限定符

①public:公共的行为或属性,任何位置都可以访问使用

②private:私有的行为或属性,只有类自己的成员函数才能访问,类的外部是不可以访问的,不写访问控制限定符,默认是私有成员

#include<iostream>
using namespace std;
class Student{
public:
        int age;//年龄
        void setid(int id);//设置学号
        int getid(void);//获得学号

private:
        int id;//私有成员学号
};
//成员函数的定义        
void Student::setid(int sid){
        id=sid;
}
int Student::getid(void){
        return id;
}
//主程序
int main(void){
        Student stu;//实例化一个对象
        stu.age=16;//ok,公有成员
        cout<<"age:"<<stu.age<<endl;//ok
        //stu.id=1;//error,私有变量不能访问
        stu.setid(1);//ok,成员函数可以访问
        cout<<"id:"<<stu.getid()<<endl;
        return 0;
}

③protected:受保护的成员,在派生类可访问

#include<iostream>
using namespace std;
class Student{
protected:
        int id;
};

class SmallStudent:Student{//派生类
public:
    void setid(int sid);
    int getid(void);
};

//成员函数的定义        
void SmallStudent::setid(int sid){
        id=sid;
}
int SmallStudent::getid(void){
        return id;
}
//主程序
int main(void){
        //Student stu;//实例化一个对象
        //stu.id=1;//error,受保护变量不能访问
        SmallStudent sstu;//子类被创建父类也就被创建了
        sstu.setid(1);//ok,成员函数可以访问
        cout<<"id:"<<sstu.getid()<<endl;
        return 0;
}

 3、构造函数(constructor)

①语法

class 类名{

        类名(形参表){//负责初始化对象(初始化成员变量)}

};

②函数名字与类名相同,且无返回类型

③构造函数在创建时自动被调用,不能像普通成员函数一样显式的调用

注:在每个对象的生命周期,构造函数一定会被调用,但只会被调用一次

#include<iostream>
using namespace std;
class Student{
public:
        Student(const string&name,int age,int no){//构造函数
            cout<<"construct func"<<endl;
            m_name=name;
            m_age=age;
            m_nu=no;
        }
        void who(void){
            cout<<"i am "<<m_name<<",age:"<<m_age<<",inode:"<<m_nu<<endl;
        }
private:
        string m_name;
        int m_age;
        int m_nu;
};
//主程序
int main(void){
        Student stu("小明",20,10010);//实例化一个对象,并匹配构造函数,初始化私有成员变量
        stu.who();
        //s.Student("小明",20,10010);//error,不能显式调用
        return 0;
}

结果:

4、对象的创建和销毁

①在栈区创建单个对象

类名 对象(构造实参表);//无实参的话不需要加括号

如果只有一个构造实参也可以:类名 对象=构造实参;

类名 对象=类名(构造实参表);//拷贝初始化

Student stu{"张飞",25,16542};
Student sua=Student{"关羽",26,15354};

②在栈区创建多个对象(对象数组)

类名 对象数组[元素个数]={类名(构造实参表),...};

③在堆区创建、销毁单个对象

创建:类名*对象指针=new 类名(构造实参表)

销毁:delete 对象指针

Student*ps=new Student("小明",21,10012);
delete ps;
ps=NULL;

④在堆区创建、销毁对象数组

创建:类名*对象指针=new类名[元素个数】{类名(构造实参表)}

销毁:delete[] 对象指针;

Student*pr=new Student[2]{
            Student("小红".23,10013),
            Student("小李",25,10001)};
detele[] pr;
pr=NULL;

5、多文件编程

①类的声明放在.h文件中

②类的实现放在.cpp源文件中

例如:

写一个头文件student.h和源文件 student.c

测试程序和结果都没问题

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐