3-3 inline、(常量成员函数)成员函数末尾的const、mutable、this、static

 

3-3 inline、const、mutable、this、static

// MyTime.h文件
#ifndef __MYTIME__
#define __MYTIME__

class MyTime
{
public:
       // 成员变量
       int Hour;
       int Minute;
       int Second;
       mutable int testValue;
    
private:
       // 成员变量
       int Millsecond;
public:
       //成员函数
       void initMillTime(int tmpMillTime);
       // 构造函数
       explicit Time(int tmphour,int tmpminute,int tmpsecond);
       Time(int tmphour,int tmpminute);
       explicit Time(int tmphour);
       explicit Time();
    static int static_value; // 静态成员变量声明
public:
       void addhour(int tmphour) const;
       //{
              //Hour += tmphour;
       //}

       MyTime& addMinute(int tmpMinute);
       MyTime& addSecond(int tmpSecond);
}

#endif
// MyTime.cpp文件
#include "head.h"

void MyTime::initMillTime(int tmpMillTime)
{
       Millsecond = tmpMillTime;
}
       // 构造函数
MyTime::Time(int tmphour,int tmpminute,int tmpsecond)
{
       Hour = tmphour;
       Minute = tmpminute;
       Second = tmpsecond;
}

MyTime::Time(int tmphour,int tmpminute)
{
       Hour = tmphour;
      Minute = tmpminute;
}

MyTime::Time(int tmphour)
{
       Hour = tmphour;
}

MyTime::Time()
{}

void MyTime::addhour(int tmphour) const
{
       // Minute = tmphour;  // 不允许修改类对象里面的任何成员
       testValue = tmphour;  //给要改变的变量前面加一个mutable就可以修改了
}

MyTime& MyTime::addMinute(int tmpMinute)
{
       Minute = tmpMinute;
       return *this; // 返回对象本身
}
 MyTime& MyTime::addSecond(int Second)
 {
       this->Second = Second;
       return *this; // 返回对象本身
}

#include <iostream>

#include "head.h"
using namespace std;

static int g_abc = 15; // 保存在静态存储区,限制该全局量只能够用在本文件中。


void func()
{
       static int abc = 5;  // 局部静态变量
       abc = 8;  // 下次执行时static int abc = 5;这条语句不执行,每次执行完保存最后修改的abc的值
}

// 静态成员变量定义
int MyTime::static_value = 15; // 可以不初始化,系统默认给0,定义时不需要static

int main()
{
   MyTime mytime;
       mytime.addMinute(10);
       mytime.addSecond(0).addMinute(20);
       MyTime mytime1;
       mytime1.Minute = 15;
       MyTime mytime2;
       mytime2.Minute = 20;

       cout << mytime1.Minute << endl;
       cout << mytime2.Minute << endl;
       return 0;
}

一、在类定义中实现成员函数inline                                                                                                                                                  类内的成员函实现其实也叫作类内的成员函数定义。

这种直接在类的定义中实现的函数,会被当做inline内联函数来处理。

二、成员函数末尾的const

const:常量,在成员函数后面增加一个const。不但需要在成员函数声明的中增加const,也要在成员函数定义中增加const。

作用:告诉系统,这个成员函数不会修改对象里面任何变量的值等等,也就是说,这个成员函数不会修改MyTime类的任何状态。

函数末尾增加一个const称为常量成员函数。

 

三、mutable

mutable,不稳定,容易被改变,mutable的引入是为了突破const的限制

一旦一个成员变量被mutable修饰了,就表示这个成员变量永远处于可以被修改的状态,即便是在const结尾的成员函数中也可以被修改。

const成员函数,则不管是const对象,还是非const对象,都可以调用const成员函数

而非const成员函数不能被const对象调用。

四、返回自身对象的引用,this

如何理解这个this?在调用成员函数时,编译器负责将这个对象的地址(&mytime)传递给这个成员函数中的一个隐藏的this形参。

在系统角度看来,任何对类成员的访问都被看做是通过this做隐式调用的。

(1)this指针只能在成员函数中使用,全局函数,静态函数不能使用this指针

(2)在普通函数中,this是指向非const对象的const指针(类型为MyTime,那么this就是MyTime *const this),表示this只能指向当前MyTime对象。

(3)在const成员函数中,this指针是一个指向const对象的const指针(类型为MyTime,this就是const MyTime *const this 类型的指针)

MyTime mytime;
mytime.addMinute(10);
mytime.addSecond(0).addMinute(20);

五、static成员

 有属于整个类的成员变量,这种成员变量就是static成员变量(静态成员变量)。

特点:不属于某个对象,属于整个类,我们一旦在某个对象中修改了这个成员变量的值,在其他对象中可以看到修改后的结果。

这种成员变量只有一个副本,对于这种成员变量的引用,我们用的是类名::成员变量名。

成员函数前面也可以加static构成静态成员函数,属于整个类的成员函数,调用的时候用类名::成员函数名。

如何定义静态成员变量:我们一般在某个.cpp源文件的开头来定义这个静态成员变量。这样就能保证在调用任何函数之前这个静态成员变量已经被初始化。

.h文件中:
static int mystatic;声明静态成员变量,还没有分配内存,所以也不能在这里初始化

.c文件中:(只能再一个cpp文件中定义)
int MyTime::static_value = 15; // 可以不初始化,系统默认给0,定义时不需要static

1.全局的静态变量:其它文件中不能使用extern

static int g_abc = 15; // 保存在静态存储区,限制该全局量只能够用在本文件中。

2.静态局部变量存放在内存的全局数据区函数结束时,静态局部变量不会消失,每次该函数调用时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。

cout << Time::mystatic << endl;

Time mytime1:
mytime1. mystatic = 40:

Time mytime2:
cout << Time::mystatic << endl:
cout << mytime1.mystatic << endl: 
cout << mytime2.mystatic << endl:

3.静态成员函数

//Time.h
class Time{
public:
    static int Hour; //这里是声明,还没有分配内存,所以不能初始化。
    //static int Hour = 4; 报错,static的声明不能直接赋值,还没有分配内存
    int Minute;
    static void msfunc();
}
 
//Time.cpp
void Time::msfunc(int temp){
    Minute = 12;//错误,因为Minute成员变量时和对象相关的
    Hour = temp; //可以
}
 
 
 
//file.cpp
 
#include "Time.h"
int Time::Hour = 12; //初始化静态成员变量Time::Hour
 
int main{
 
    cout << Time::Hour << endl;
    Time mytime1;
    mytime1.Hour= 15;
 
    Time mytime2;
    cout << mytime1.Hour << endl;
    cout << mytime2.Hour << endl;
}

https://blog.csdn.net/my_mao/article/details/22872149

http://www.cnblogs.com/xkfz007/articles/2419540.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值