C++基础08---this,static

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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值