类与对象

面向过程与面向对象的区别:

程序=算法+数据结构
面向过程的程序设计中一般是将二者分开来,一种算法对应多组数据结构或是一组数据对应多种算法,数据和算法都是公用的,数据可被任何操作修改和使用,显然,这种做法缺乏安全性。

面向对象的程序设计刚好解决了这个问题,就是说,一种操作对应一组数据,将相关的数据和操作放在一起,形成一个整体,与外界分隔开来,这就是我们常说的对象。即就是:
对象=算法+数据结构
程序=(对象+对象+……+对象)+消息
其中,消息是对对象的控制。

面向对象实质是基于类和对象的程序设计,程序的操作是围绕对象进行的。


类的概念:

C++中对象的类型称为类,类代表了某一批对象的共性和特征。可以说,类是对象的抽象,而对象是类的实例化。类似于结构体和结构体变量之间的关系。
类是抽象的,不占内存,而对象是具体的,占用内存空间。

类的定义:

包括类头(classhead)和类体(classbody)。类头由关键字class 和类名构成,类体是放在花括号里的内容,花括号后面记得加分号。

//定义一个学生类
class Student
{
    char _name[20];
    char _gender[3];
    int _age;
};

类体中可以包含什么内容呢?之前我们在学C时学到了结构体,C中结构体的成员可以是不同类型的变量,在C++中结构体有所发展,C++的结构体不但可以定义不同类型的变量,还可以定义一些函数。类与其相似,类中可以包括成员变量和成员函数。如:

//定义一个学生类
class Student
{
    char _name[20];
    char _gender[3];
    int _age;
    void InitInfo(char name,char gender,int age);
    void PrintInfo();
};

类中还存在三种成员访问限定符:

  • public:共有的,在程序的任何地方都可被访问,一般用来修饰成员函数,在类外要访问这些成员函数时通过 对象.成员函数 或是 对象指针–>成员函数 来访问。
  • private:私有的,类内相当于全局变量,可被任何成员函数访问,在类外不可见不可被访问,一般用来修饰成员变量。
  • protect:保护的,对派生类相当于公有成员一样,除本类和派生类的其他地方相当于私有成员。

在上述代码中,我们未指定其访问限定符,类中默认为私有成员,而在结构体中类中成员默认为公有的,因为结构体要兼容C。

//定义一个学生类
class Student
{
public: 
    void InitInfo(char name,char gender,int age);
    void PrintInfo();
private:
    char _name[20];
    char _gender[3];
    int _age;
};

public成员和private成员的声明次序不做要求可以任意指定,public和private也可分别出现多次,通常情况下,为避免混淆,我们习惯使两个限定符只出现一次,并且先声明公有的成员函数,再声明私有的成员变量。
每个成员访问限定符的有效作用范围是从其冒号开始到下一个成员访问限定符出现或者类声明结束为止。

注意:访问限定符只在编译时有用,当数据映射在内存上时,没有任何访问限定符上的区别。

类的定义一般有两种方式:

  • 类的声明和定义全部放在类体中
//定义一个学生类
class Student
{
public: 
    void InitInfo(char name,char gender,int age)
    {
        strcpy(_name,name);
        strcpy(_gender,gender);
        _age=age;
    }
    void PrintInfo()
    {
        cout<<_name<<" "<<_gender<<" "<<age<<endl;
    }
private:
    char _name[20];
    char _gender[3];
    int _age;
};
  • 类的声明放在 .h 文件中,定义放在 .cpp 文件中

//student.h
class Student
{
public: 
    void InitInfo(char name,char gender,int age);
    void PrintInfo();
private:
    char _name[20];
    char _gender[3];
    int _age;
};



//student.cpp
    void Student:: InitInfo(char name,char gender,int age)
    {
        strcpy(_name,name);
        strcpy(_gender,gender);
        _age=age;
    }
    void Student:: PrintInfo()
    {
        cout<<_name<<" "<<_gender<<" "<<age<<endl;
    }

当类的成员函数比较少并且函数实现简单时,我们采取方法一,若成员函数较多或者函数复杂时宜用方法二。


问题:如何访问类中的私有成员变量呢?

  1. 如上述学生类中,我们需要访问其年龄。因为类中的成员函数对类中的私有成员是有访问权限的,最简便的方式是在类中加上一个成员函数 int GetAge(){ return _age; },将该函数声明为公有的,通过在类外访问该函数即可访问该成员变量。
  2. 通过友元函数来访问
  3. 可通过指针的偏移来访问该私有成员变量的地址。
    int *p=(int *)((char *)&s+20);//其中s为该类的一个对象


类的实例化:

一个类相当于一个模板,可以使用这一模板来创建对象,其过程就成为类的实例化。一个类可以实例化出多个对象,实例化出的对象系统为它分配该类大小的物理空间来存储类中的成员。

int main()
{
    Student s1;
    s1.InitInfo("陈独秀""男"20);
    s1.PrintInfo();
    return 0;
}

一个类的大小就是该类中成员变量之和,与结构体类似

定义一个空类,里面没有任何成员变量和成员函数,对该类型求sizeof,其结果应该是多少呢?

答案是1,空类的实例中不包含任何信息,本来结果应该为0,但是我们在声明一个类的对象时,它必须在内存中占一定的空间,否则无法使用,具体占多少字节由编译器决定,一般占一个字节的空间。
那么,如果我们在该空类中加上构造函数和析构函数,结果是多少呢?
还是1,因为调用类的成员函数只需要知道函数的地址即可,函数的地址与类类型有关,与该类的实例没有关系,因此编译器不会因为这两个函数在实例内添加任何信息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值