类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类外定义成员,需要使用::作用域解析符,指明成员属于哪个类域
比如下面这个例子:
#include <iostream>
using namespace std;
class Person
{
public:
void PrintPersonInfo();
private:
char m_name[20];
char m_gender[3];
int m_age;
};
//这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
cout << m_name << ' ' << m_gender << ' ' << m_age << endl;
}
类的实例化
当我们使用一个类去创建对象时,就称为类的实例化
- 类其实可以看作一个模型一样的东西,限定了类有哪些成员。当我们定义出了一个类并没有分配实际的内存空间来存储它;
- 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量
- 可以看个例子来说明,比如我们在建筑房子的时候需要有设计图,我们需要拿着建筑设计图去建造房子,而类就像是这个设计图,只需要设计出需要什么东西,但是并没有实际的实体建筑物存在,所以说类同样也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
再来看一个代码示例
#include <iostream>
using namespace std;
class Person
{
public:
char * m_name;//姓名
char * m_sex; //性别
int m_age; //年龄
//显示基本信息
void showInfo();
};
void Person::showInfo()
{
cout << m_name << ' ' << m_sex << ' ' << m_age << endl;
}
int main()
{
Person man;
man.m_name = "Jack";
man.m_sex = "男";
man.m_age = 10;
man.showInfo();
system("pause");
return 0;
}
Person是一个类,而man就是Person这个类实例化出的对象。
this指针
this指针的引出
这里我们可以先定义一个日期类
#include <iostream>
using namespace std;
class Date
{
private:
int m_year;
int m_month;
int m_day;
public:
void SetDate(int year, int month, int day)
{
m_year = year;
m_month = month;
m_day = day;
}
void display()
{
cout << m_year << '-' << m_month << '-' << m_day << endl;
}
};
int main()
{
Date d1, d2;
d1.SetDate(2019, 11, 28);
d2.SetDate(2019, 11, 11);
d1.display();
d2.display();
system("pause");
return 0;
}
在上面的这个类中,我们定义了SetDate和display两个成员函数,那么函数是如何知道应该设置d1对象,而不是设置d2对象的呢?
这就引出了this指针,在C++当中,通过this指针就能解决该问题,即:C++编译器给每个“成员函数”增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象)。
在函数体当中,所有成员变量的操作,都是通过该指针去访问。
比如上面的display函数
其实就是
void display(Date * this)
{
cout << this->m_year << '-' << this->m_month << '-' << this->m_day << endl;
}
this指针的特性
- this指针的类型:是当前类类型的指针,this是一个常量指针,不能更改指向
- 只能在“成员函数”的内部使用,成员函数中,this指针中的成员不需要使用this指针访问,直接访问即可
- 一般成员函数中都含有一个this指针,这个指针指向调用这个成员函数的对象。