1. this
(1)在我们利用某个类对象调用成员函数时,编译器将这个对象的地址传递给该成员函数中的一个隐藏的this形参。
(2)任何对类成员变量的直接访问都被看作是通过this做隐式调用
(3)this指针只能在成员函数中使用,全局函数、静态函数都不能使用this
(4)在普通成员函数中,this是一个指向非const对象的const指针(类型为Time, 则this就是Time *const this),表示this只能指向当前Time对象。
(5)在const成员函数中,this是一个指向const对象的const指针(类型为Time, 则this就是const Time *const this)即this只能指向当前Time对象,且无法修改Time对象的成员变量。
#ifndef DAY02_TIME_H
#define DAY02_TIME_H
//类的声明
class Time
{
public:
int m_Hour;
int m_Minute;
public:
Time(int hour, int minute);
Time& add_hour(int add_hour);
Time& add_minute(int add_minute);
};
#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"
//构造函数初始化
Time::Time(int hour, int minute) : m_Hour(hour), m_Minute(minute){}
//成员函数
Time& Time::add_hour(int add_hour) //等价于 Time& Time::add_Hour(Time* const this, int add_hour)
{
m_Hour += add_hour; //this->m_Hour += add_hour
return *this; //this是指向Time实例对象的指针。*this则是该对象自己
}
Time& Time::add_minute(int add_minute)
{
m_Minute += add_minute;
return *this;
}
int main(){
Time time1(10, 10);
time1.add_hour(8); //等价于 time1.add_hour(&time1, 8)
time1.add_minute(2); //m_Minute:12
time1.add_hour(2).add_minute(1).add_hour(2); //由于每次返回的都是time1对象,因而可以连续调用
cout << time1.m_Hour << endl; //m_Hour:22
cout << time1.m_Minute << endl; //m_Minute:13
}
2. static
2.1 static 修饰变量
(1)static修饰的变量被存储在静态存储区。
(2)局部静态变量(函数中static型变量),值维持上次调用函数时的值。
int func1()
{
static int a = 0; //下次调用func1()时,a维持上一次的值
a++;
return a;
}
int main() {
cout << func1() << endl; // 1
cout << func1() << endl; // 2
}
(3)全局静态变量,限制该全局变量只能够在本文件中使用。
2.2 static成员变量
(1)静态成员变量属于整个类。
(2)若在某个对象中修改了静态成员变量的值,则其它对象能直接看到修改结果。
(3)利用类名::成员变量名可以直接调用静态成员变量。
#ifndef DAY02_TIME_H
#define DAY02_TIME_H
//类的声明
class Time
{
public:
int m_Hour;
static int staticHour; //静态成员变量的声明,此时还没有分配内存,因而不可以初始化
public:
Time(int hour);
};
#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"
//静态成员变量的定义(分配内存)
int Time::staticHour = 12; // 定义时不加static,可以不给初值,系统默认给0
Time::Time(int hour)
{
m_Hour = hour;
}
int main() {
//1. 直接访问
cout << Time::staticHour << endl; //12
//2. 对象访问
Time time1(10);
Time time2(20);
time1.staticHour = 15; //静态成员变量跟着类走,此时类中的staticHour被改为15
cout << time1.staticHour << endl; //15,time1.staticHour、time2.staticHour、Time::staticHour地址相同
cout << time2.staticHour << endl; //15
cout << Time::staticHour << endl; //15
}
2.3 static成员函数
(1)静态成员函数属于整个类。
(2)静态成员函数中不可修改和对象相关的成员变量,但是可以修改与类相关的成员变量(静态成员变量)。
(3)利用类名::成员函数名可以直接调用静态成员函数。
#ifndef DAY02_TIME_H
#define DAY02_TIME_H
//类的声明
class Time
{
public:
int m_Hour;
static int staticHour; //静态成员变量的声明,此时还没有分配内存,因而不可以初始化
public:
Time(int hour);
public:
static void staticFunc(int val); //静态成员函数的声明
};
#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"
//静态成员变量的定义(分配内存)
int Time::staticHour = 12; // 定义时不加static,可以不给初值,系统默认给0
Time::Time(int hour)
{
m_Hour = hour;
}
void Time::staticFunc(int val)
{
// m_Hour = 5; //错误,m_Hour是和对象相关的成员变量,无法修改
staticHour = val; //正确,staticHour也是属于类的成员变量,可修改
}
int main() {
//1. 直接访问
Time::staticFunc(0);
cout << Time::staticHour << endl; //0
//2. 对象访问
Time time1(10);
Time time2(20);
time1.staticFunc(10); //静态成员函数跟着类走,此时类中的staticHour被改为10
cout << time1.staticHour << endl; //10,time1.staticHour、time2.staticHour、Time::staticHour地址相同
cout << time2.staticHour << endl; //10
cout << Time::staticHour << endl; //10
}