【C++】初识类和对象

  我们都知道,C++并不是一种纯粹的面向对象的语言,而是一种基于过程和面向对象的混合型的语言。在面向对象的程序中,除主函数外,其他函数基本上都是出现在“类”中,只有通过类才能调用类中的函数。程序的基本构成单位是类,程序面对的是一个一个的类和对象。凡是以类对象为基本构成单位的程序称为基于对象的程序。
  面向对象程序设计(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
  面向对象程序设计有4个主要特点:抽象、封装、继承和多态性。 
  类是对象的抽象,对象是对类的具体实例。 
  
  声明类:
  class 类名
  {
   public:
      私有的数据和成员函数;
   private:
      公有的数据和成员函数;
  };
  C++中的基本数据类型(内置类型):字符型char,整型int,浮点型float/double,逻辑性bool,无类型void,数组,指针。非基本数据类型(自定义类型):结构体struct,联合体union,枚举enum,类class。
  类的访问限定符:public(公有),private(私有),protected(受保护的)。
  【注意】
  1.public成员可从类外部直接访问,private/protected成员不能从类外直接访问。
  2.每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符出现时为止或类体结束前。 
  3.类中若没有定义限定符,则默认为private;而结构体中默认为public。
  4.类的访问限定符体现了面向对象程序设计的封装性。
  了解了这些后,我们声明一个类:

class Person
{
public:
    void Display()
    {
        cout << _name << "-" << _sex << "-" << _age << endl;
    }
private:
    char* _name;
    char* _sex;
    int _age;
};

上面的类中,类名为Person,类内定义了一个公有的成员函数Display,声明了三个私有的成员变量。其实类有两种定义形式:第一种如上(直接在类声明时定义);第二种即声明和定义不再同一个文件中,这种一般将类的声明放在头文件(.h)中,将类的定义放在.cpp文件中,.h头文件和.cpp源文件的名字最好相同。我们更倾向于第二种定义方式。
  如何定义对象?
  类实例化:用类类型创建对象的过程。
  类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量。
  1. 类的声明后定义对象

class Person
{
public:
    void Display()
    {
        cout << _name << "-" << _sex << "-" << _age << endl;
    }
private:
    char* _name;
    char* _sex;
    int _age;
};
    ...
class Person pers1, pers2;//①class和Person合起来作为类名
Person pers1, pers2;//②不加类名。①②两种是等效的

  2. 声明类的同时定义对象

class Person
{
public:
    void Display()
    {
        cout << _name << "-" << _sex << "-" << _age << endl;
    }
private:
    char* _name;
    char* _sex;
    int _age;
}pers1, pers2;//"}"后不能加";"

  3. 声明无名类后直接定义对象

class 
{
public:
    ...
private:
    ...
}pers1, pers2;//定义了两个无类名的对象

以上三种方法最好采用第一种
  如何定义和声明成员函数?
  1. 类内定义成员函数:

class Person
{
public:
    void Display()
    {
        cout << _name << "-" << _sex << "-" << _age << endl;
    }
private:
    char* _name;
    char* _sex;
    int _age;
};

  2. 类外定义成员函数

class Student
{
public:
    void Display();//在类内声明成员函数
private:
    char* name;
    char* sex;
    int num
};
void Student::Display()//类外定义成员函数
{
    cout << name << "-" << sez << "-" << num << endl;
}

其中,“::”为作用域限定符,它用于说明函数是哪个类的,若在类外定义成员函数时没有“Student::”的限定,则不是Student类中的Display函数。
  【注意】这种方式应使类体的位置在函数定义之前,否则代码不能通过编译。
  如何访问类对象成员?
  在定义了数据和成员函数以及类对象后,我们还需要访问对象中的成员。
  1.“对象名.成员名”
  例如:

class Date
{
public:
    void Display()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year;
    int _month;
public:
    int _day;
};
int main()
{
    Date d;
    d._year = 2018;
    d._month = 3;
    d._day = 24;
    d.Display();
    return 0;
}

这里写图片描述
可见:私有成员在类外不能被类对象访问。
  2.“对象指针->成员名”

class Date
{
public:
    void Display()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year;
    int _month;
public:
    int _day;
};
int main()
{
    Date d;
    Date* p = &d;//定义指向对象d的指针变量p
    p->_year = 2018;
    p->_month = 3;
    p->_day = 24;
    p->Display();
    return 0;
}

如上代码可得:d._year,(*p)._year和p->_year三者等价。
  类对象存储模型
  每个对象在被定义之时,系统会为每一个对象分配存储空间。一个对象包括数据和函数代码。同一个类的不同对象中的数据成员的值一般是不相同的,而不同对象的函数的代码是相同的,不论调用哪一个对象的函数的代码,其实调用的都是同样内容的代码,即应该有一份公用的函数代码。
  这里写图片描述
由上图可知:每个对象所占用的存储空间只是该对象的数据成员所占用的存储空间,而不包括函数代码所占用的存储空间。这样的存储模型大大节省了内存空间。

猜你喜欢

转载自blog.csdn.net/Sunshine_R9H15Chen/article/details/79633729