类和对象基础知识

首先我们来了解一下OOP(面向对象)思想的最重要的特性:

  • 对象和类
  • 封装和数据隐藏
  • 继承
  • 多态

本文介绍对象和类,在我们初学C++语言时有关对象和类的理解是相对模糊的(我也是过度了一段时间才理解过来)。

类是什么?

  • C++中的类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操作数据的方法组合成一个整洁的包,通过class关键字来定义一个类。在类中的数据类型被分为三种形式:public、private、protected。
    类设计尽可能将共有接口与实现细节分开。通常间数据设置为私有的(private),接口(成员方法)设置为共有的。共有接口表示设计的抽象组件。将实现细节放在一起并将他们与抽象分开被称为封装。数据隐藏(将数据放在类的私有部分中)是一种封装,将实现的细节隐藏在私有部分中,也是一种封装。
    对象使用方法时,即调用成员函数时,它将使用被用来调用它的对象的数据成员。所创建的每个新对象都有自己的存储空间,存储其内部变量和类成员;当同一个类的所有对象共享同一组类方法,既每种方法只有一个副本。在OOP中,调用成员哈数被称为发送消息,因此将同样的消息发送给两个不同的对象将调用同一个方法,但该方法被用于不同的对象。
    例如:
class Goods//定义一个名为Goods的类
{
    public://共有部分,多定义一些成员函数
    private://私有部分,多定义类生成对象的数据
        char *name;
        int price;
    protected://受保护部分,不太使用
}

类的使用

  • C++的目标是使得使用类与使用基本的内置类型(int和char)尽可能相同。要创建类对象,可以声明类变量,也可以使用new为类对象分配存储空间。可以将对象作为函数的参数和返回值,也可以将一个对象赋给另一个。

类的构造函数和析构函数

  • 在类中,数据部分的访问状态是私有的,这意味着程序不能直接访问数据成员,程序只能通过成员函数来访问数据成员,因此需要设计合适的成员函数,才能成功地将对象初始化(如果使数据成员称为公有,而不是私有,违背了类的一个主要出初衷:数据隐藏),一般来说,最好是在创建对象时对它进行初始。
  • 但是对象的部分成员的值是不存在的,为了更加大众普及化,有一个特殊的成员函数–类构造函数,专门用于构造新对象、将值赋给他们的数据成员。更准确的说,C++为这些成员函数提供了名称和使用语法,而程序员需要提供方法定义。名称与类名相同。Stock类一个可能的构造函数是名为Stock()的成员函数,构造函数的原型和函数头有一个有趣的特征–虽然没有返回值,但没有被声明为void类型。构造函数没有声明类型。
//声明和定义构造函数。有了构造函数,程序声明对象时,将自动调用构造函数。构造函数的参数名不能和类成员名称一样。
//使用构造函数C++提供了两种使用构造函数来初始化对象的方式,第一种就是显示的调用构造函数:另一种是隐式的调用:
   class Goods
   {
       public:       //共有的成员方法(函数接口)在类外也可以访问,但依赖对象。
                     //默认的构造函数
           Goods()
           {
               cout << "Goods::Goods()" << endl;
           }

                    //带参数的构造函数
           Goods(string name, float price, int count) :mprice(price), mcount(count)
                    //通过传入的数据初始化成员变量
           {
               cout << "Goods::Goods(string, float, int)" << endl;
               mname = new char[strlen(name) + 1]();
               strcpy(mname, name);
           }
           ~Goods()
           {
               cout << "Goods::~Goods()" << endl;
           }
           //对于析构函数也有默认的和程序员自己实现的两种。在程序运行完后系统会自己调用析构函数,默认的成员函数也是由系统来调用的。
           void show()
           {
               cout << "Goods::show()" << endl;
           }

       private:     //私有的内部变量,只允许在类中访问
           char *mname;
           float mprice;
           int mcount;
   }

   int main()
   {
       Goods good1;//调用默认的构造函数生成的对象good1
       Goods good2("water", 1.0, 100);//调用带参数的构造函数生成的对象good2
       good1.show();
       good2.show();
       return 0;
   }

注:成员变量在初始化时的先后顺序与初始化列表的先后顺序无关,只与成员变量在类中定义的先后顺序有关,先定义、先初始化
构造函数的使用方式不同于其他类方法,一般来说,使用对象来调用方法:good1.show();
但无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。因此构造函数被用来创建对象,而不能通过对象来调用。如果没有任何构造函数,则C++将自动提供默认的构造函数。不做任何工作。当且仅当没有任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,当没有提供默认的构造函数,则生成good1的Goods good1将出错:
如果要创建对象,而不显示地初始化,则必须定义一个不接受任何参数的默认构造函数。定义默认构造函数的方式有两种:一种是通过函数重载来定义另一个构造函数–一个没有参数的构造函数:另一种是给已有的构造函数的所有参数提供默认值;如:

Goods(string name = NULL, float price = 0.0, int count = 0) : mname(name),mprice(price), mcount(count)
{
    cout << "Goods::Goods(string, float, int)" << endl;
}

同时固定只能有一个默认的构造函数,因此不要同时使用上述的两种方式。

this指针

  • 每个类成员函数都设计一个this指针指向用来调用成员函数的对象(为隐式的)。但有的时候可能设计到两个对象,在这种情况下使用C++的this指针和传入一个显式的对象。如拷贝构造函数:
Goods(Goods *this, const Goods &rhs)
{
     this->mname = new char[strlen(rhs.mname) + 1]();
     strcpy(this->mname, rhs.mname);
     this->mprice = rhs.mprice;
     this->mcount = rhs.mcount;
}
//但this指针是类中的一个隐式的指针,可以以隐式的形式来使用,则上面的代码通常情况下写成
Goods( const Goods &rhs)
{
     mname = new char[strlen(rhs.mname) + 1]();
     strcpy(mname, rhs.mname);
     mprice = rhs.mprice;
     mcount = rhs.mcount;
}
//这也是在一些成员方法函数中不传参数的原因。

注:在此处开辟空间是为了避免浅拷贝带来的内存问题,重新开辟一块一样大小的空间以实现的是深拷贝。

  • 该函数隐式地访问一个对象,而显示地访问另一个对象。括号中的const表明,该函数不会修改被显示地访问的对象。
    补充:const 在此处的作用是防止被引用的对象被间接的修改。一遍在类的成员函数中const有两种用途,一个是起保护作用,另一个是隐式生成的常对象的引用作为函数参数传递时用来接收的常引用。

在类中我们会看到如下函数:

void show()const
{
     cout << "Goods::show()" << endl;
}
  • 括号后的const表明,该函数不会修改被隐式地访问的对象,也就是说该const是修饰this指针的,这样就可以通过一个常对象来调用该函数。

this指针指向用来调用成员函数的对象。这样,主函数调用那个对象下的成员方法就将this设置为该对象的地址,使得这个指针可用于类成员方法。一般来说,所有的类方法都将this指针设置为调用它的对象的地址。每个成员方法都有一个this指针。this指针指向调用对象,如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样将不能使用this来修改对象的值。

总结:类只是C++中的一种工具,而对象是通过这种工具将抽象的数据类型实例化的到的一个具体。通过该对象可以调用类中除构造、析构(虽然对象可以调用析构函数,但对象调用之后系统还会调用一次,这样会导致程序崩溃,故不能使用对象调用析构函数)和static关键字修饰的成员方法以外的成员方法。对象的生成方式有显示和隐式两种。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值