C++面向对象
一、类和对象
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用 于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。
打个比方说明一下什么是类,比如有一条小狗,小狗有名字叫旺财,旺财的年龄是 2 岁, 同时旺财会汪汪的叫,也能跑。我们统称狗这个为类,类是我们抽象出来的,因为狗不只有上 面的属性,还有体重,毛发的颜色等等,我们只抽象出几种属性成一个类。具体到哪条狗就叫 对象。
类与对象的思想
面向对象的特点:封装、继承、多态
面向对象编程的特点:
(1)易维护:可读性高,即使改变了需求,由于继承的存在,只需要对局部模块进行修改,维护起来非常方便,维护的成本也比较低。
(2)质量高:可以重用以前项目中已经被测试过的类,使系统满足业务需求从而具有更高的质量
(3)效率高:在软件开发时,根据设计的需求要对现实世界的事物进行抽象,从而产生了类
(4)易扩展:由于继承、封装、多态的特性,可设计出高内聚、低耦合的系统结构,使系统更加灵活、更容易扩展,而且成本也比较低。
从类中实例化对象分两种方法,一种是从栈中实例化对象,一种是从堆中实例化对象。
下面以自定义狗类介绍如何自定义类和如何使用对象。
#include <iostream>
#include <string.h>
using namespace std;
class Dog //创建一个类
{
public: //访问限定符 public(公有的),此外还有 private(私有的)和 protected(受保护的)。
//写这个的目的是为了下面我们要调用这些成员,不写访问限定符默认是 private。简单的来说,访
//问限定符就是设置一个成员变量和成员函数的访问权限而已
string name; //string 是 C++的数据类型,方便好用,使用频率相当高。
int age;
void run()
{
cout << "小狗的名字是:" <<name<<","<<"年龄是"<<age<<endl;
}
};
int main(int argc, char const *argv[])
{
Dog dog1; //从栈中实例化一个对象
dog1.name = "旺财";
dog1.age = 2;
dog1.run();
Dog *dog2 = new Dog(); //从堆中实例化一个对象
if (dog2 == NULL)
{
return 0;
}
dog2->name = "富贵";
dog2->age = 1;
dog2->run();
delete dog2; //删除从堆空间申请的内存
dog2 = NULL;
return 0;
}
编译完成后执行的结果如下。
二、构造函数与析构函数
什么是构造函数?
构造函数在对象实例化时被系统自动调用,仅且调用一次。构造函数出 现在哪里?前面我们学过类,实际上定义类时,如果没有定义构造函数和析构函数,编译器就 会生成一个构造函数和析构函数,只是这个构造和析构函数什么事情也不做,所以我们不会注 意到一点。
构造函数的特点如下:
(1) 构造函数必须与类名同名;
(2) 可以重载,(重载?新概念,后面学到什么是重载。);
(3) 没有返回类型,即使是 void 也不行。
什么是析构函数?
与构造函数相反,在对象结束其生命周期时系统自动执行析构函数。实 际上定义类时,编译器会生成一个析构函数。
析构函数的特点如下:
(1) 析构函数的格式为~类名();
(2) 调用时释放内存(资源);
(3) ~类名()不能加参数;
(4) 没有返回值,即使是 void 也不行。
通过简单的例子来说明构造函数和析构函数的使用
#include <iostream>
#include <string.h>
using namespace std;
class Dog
{
public:
Dog(); //构造函数
~Dog(); //析构函数
};
int main(int argc, char const *argv[])
{
Dog dog;
cout<<"构造与析构函数示例"<<endl;
return 0;
}
Dog::Dog()
{
cout<<"构造函数执行!"<<endl;
}
Dog::~Dog()
{
cout<<"析构函数执行!"<<endl;
}
编译完成后执行的结果如下。
其实执行的结果也是可以预测的,在对象实例化时会调用构造函数,所以 Dog()先执行, 然后再在 main()函数里继续执行 cout<<"构造与析构函数示例"<<endl; 最后对象生命周期结束时才会执行析构函数。
三、 this 指针
一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码,那么 成员函数如何知道要访问哪个对象的数据成员呢?
就是通过 this 指针。每个对象都拥有一个 this 指针,this 指针记录对象的内存地址。 在 C++中,this 指针是指向类自身数据的指针,简单的来说就是指向当前类的当前实例对象。
关于类的 this 指针有以下特点:
- (1) this 只能在成员函数中使用,全局函数、静态函数都不能使用 this。实际上,成员函数 默认第一个参数为 T * const this。也就是一个类里面的成员了函数 int func(int p),func 的原 型在编译器看来应该是 int func(T * const this,int p)。
- (2) this 在成员函数的开始前构造,在成员函数的结束后清除。
- (3) this 指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全 局变量。
下面以简单的例子来说明 this 的用法。我们还是以狗类为例,按上面的 this 解释,this 只 能够在成员函数使用,并可以指向自身数据。
#include <iostream>
#include <string.h>
using namespace std;
class Dog
{
public:
string name;
void func();
};
int main(int argc, char const *argv[])
{
Dog dog;
dog.func();
return 0;
}
void Dog::func()
{
this->name = "旺财";
cout<<"小狗的名字叫:"<<this->name<<endl;
}
程序执行的结果如下。