C++面向对象
一、类和对象
从类中实例化对象分两种方法,一种是从栈中实例化对象,一种是从堆中实例化对象。
下面以自定义狗类介绍如何自定义类和如何使用对象。
#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;
}
编译完成后执行的结果如下。
三、 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;
}
程序执行的结果如下。