天天看点

【C++】类和对象

之前已经说过类有三大特性,封装,多态,继承。

C++是一个面向对象的程序设计语言。对象是什么?客观世界里的任何一个事物都可以看成一个对象。任何一个对象都具有两个要素,属性和行为。一个对象往往是由一组属性和一组行为构成的。

现在来说说封装。

所谓封装,一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不干扰。二是将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口以便与外界联系。

一、类和对象

类是C++中极为重要的概念。在C++中对象的类型叫类,类是对象的抽象,而对象是类的具体实例。

访问限定符

此三类修饰符在【Java】类和对象中有阐述,这里不做解释。

1、声明类类型

声明类的方法是由结构体类型的方法发展而来的。

class Student
{
int num;
char sex;
void display()
     {
    cout<<"num:"<<num<<endl;
    cout<<"sex:"<<sex<<endl;
    }
};
Student stu1,stu2;//定义了两个Student类的对象stu1,stu2。
           

class Student叫做类头,类头以下的花括号里的就是类体。类的声明以一个分号结束。

如果类的定义既不指定private,也不指定public,则系统默认为私有的。

综上得到类定义的一般形式:

class 类名
{  private :
    私有的成员数据和成员函数
   public:
        公有的成员数据和成员函数
};//分号一定不能忘
           

2、定义对象的方法

(1)、先声明类类型,再定义对象。

(2)、在声明类类型的同时定义对象。

class Student
{
int num;
char sex;
void display()
     {
    cout<<"num:"<<num<<endl;
    cout<<"sex:"<<sex<<endl;
    }
}stu1,stu2;
           

(3)、不出现类名,直接定义对象

class
{
int num;
char sex;
void display()
     {
    cout<<"num:"<<num<<endl;
    cout<<"sex:"<<sex<<endl;
    }
}stu1,stu2;
           

二、类的成员函数

类的成员函数与其他函数的用法和作用基本上一样,但它是属于类的成员,出现在类体中。它可以被访问限定符修饰。

可以在类内声明,类外定义,也可以类内声明加定义。

(1)、构造函数:构造函数是一种特殊的成员函数,它是建立对象是自动建立的。构造函数的名字必须与类名同名并且不具有任何类型也没有返回值(这点java也具有),在建立对象时自动执行构造函数,它的作用是为该对象中的各数据成员赋初值0。类内类外都可以定义,在类外定义构造函数,需要在类内声明,要加上类名和域限定符”::“。[ 如果用户没有定义构造函数,则系统会生成一个构造函数 ]。———-无参的构造函数与全缺省的构造函数只能有一个存在。

(2)、拷贝构造函数

—–创建对象时,使用同类对象进行初始化

—–也属于构造函数的一种

—–属于构造函数的重载

—–必须使用引用传参,最好在引用前加上const

—–若未定义,系统会默认缺省的拷贝构造函数,依次对成员进行初始化

(3)、析构函数

——当一个对象的生命周期结束时,系统会自动调用一个析构函数,将其释放

——在类名前加上~,不能重载

——无参数,无返回值,一个类有且只有一个析构函数

——它的作用并不是删除对象,而是完成一些清理工作

(4)、运算符重载

运算符重载的方法是定义一个重载运算符的函数,运算符的重载实际上是函数的重载。

—–重载运算符的函数一般格式如下:

函数类型 operator 运算符名称 (形参表列)
{对运算符的重载处理}
           

注意:

5个C++不能重载的运算符: .* / :: / sizeof / ? / .

重载运算符的规则:

——C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。

——重载不能改变运算符运算对象(即操作数)的个数

——重载不能改变运算符的优先级

——重载不能改变运算符的结合性

——重载运算符的函数不能有默认的参数

——运算符重载函数可以是类的成员函数

三、隐含的this 指针

在每一个成员函数中都包含一个特殊的指针,这个指针的名字叫this,是固定的。它是指向本类对象的指针,它的值就是当前被调用的成员函数所在的对象的起始地址。

this指针是隐式使用的,它是作为参数被传递给成员函数的。

例如:

int Box :: volumn()
{return height*width*length;}
//程序运行时会转化为
int Box :: volumn(Box *this)//隐式指针this
{return this->height * this->width * this->length;}

//而在调用成员函数时,实际上是这样的:
a.volumn(&a);
           

继续阅读