关键字static和const

static

在学习到C++类时有一个关键词叫static,在C语言中也遇到过,所以在这里回顾并总结一下static的作用。

static在C语言中的作用

static修饰局部变量,改变局部变量的生命周期,但是不改变其作用域,生命周期直到文件销毁。

static修饰全局变量,改变全局变量的连接属性,只能在本文件中被使用,使用extern外部声明也不行。

static在C++的作用

声明为static的类成员,成为类的静态成员。

class CDate
{
public:
    CDate( int year = 1990, int month = 1, int day = 1)
    : _year(year)
    , _month(month)
    , _day(day)
    {
      _count++;
    }
    void Display()
    {
      cout<<GetDateCount()<<endl;
      cout<<_year<< " "<<_month<<" "<<_day<<endl;
    }
    ~CDate()
    {
      _count--;
    }
    //静态成员函数
    static int GetDateCount()
    {
      //Display();
      return _count;
    }
private:
    int _year;
    int _month;
    int _day;
    //静态成员变量
    static int _count;
};

int CDate::_count = 0;

在这里_count就是一个静态的成员变量。

1、静态成员为所有类对象所共享,不属于某个具体的实例。

2、类静态成员即可用类名::静态成员或者对象.静态成员来访问
CDate::_count;

CDate c1;
c1->_count;

3、类静态成员变量必须在类外定义,定义时不添加static关键字

4、类的静态成员函数没有默认的this指针,因此在它里面不能使用任何非静态成员
static int GetDateCount()
{

  Display();
  return _count;

}

这里写图片描述

const

用来修饰变量的时候

type const valueconst type value

这两种格式在本质上时没有区别的,都是type类型的value的值不能改变。

用来修饰指针的时候

//const修饰的时value指针,表示指针本身不可变,即指针所指向的空间是不能变的.
char* const value;

//const 修饰的是char*或者说是*value,即对指针的解引用,表示指针所指向空间的内容不可变.
const char* value;
//也可写为
char const* value;

//const同时修饰
const char * const value;

对于const修饰对象的区分还有一个方法,就是看const位于*的哪一边
位于左边就是对指针指向内容的修饰;
位于右边就是对指针本身的修饰.

用来修饰类成员时有以下几种用法:

1、const修饰形参,一般和引用同时使用

void test(const int a);//无意义,因为在传值时传的时临时变量,其修改对实参无影响,不需要保护.
void test(const char* a);//参数指针所指向的内容为常量不可变.
void test(char* const a);//无意义,因为指针本身也是通过传值的形式来使用的,不需要保护.
void test(const Class& a);//引用参数在函数内不能改变.

2、const修饰返回值

如果给采用“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针所指的内容)不能被修改,该返回值只能被赋给加const 修饰的同类型指针:

const char GetString(void);*

如下语句将出现编译错误:

char *str=GetString();

正确的用法是:

const char *str=GetString();

3、const修饰类数据成员,必须在构造函数的初始化列表中初始化

const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const数据成员的值是什么,要想建立在整个类中都恒定的常量,可以用类中的枚举常量来实现,例如:
class A
{
…
  enum {size1=100, size2 = 200 };
  int array1[size1];
  int array2[size2]; 
…
}

而以下这种方式是不行的:
class A
{

const int size = 100;
int arr[size];

}

这里写图片描述

4、const修饰类成员函数,实际修饰隐含的this,表示在类中不可以对类的任何成员进行修改

class CDate
{
public:
    CDate( int year = 1990, int month = 1, int day = 1)
    : _year(year)
    , _month(month)
    , _day(day)
    {
      _count++;
    }
    void Display()
    {
      cout<<GetDateCount()<<endl;
      cout<<_year<< " "<<_month<<" "<<_day<<endl;
    }
    ~CDate()
    {
      _count--;
    }
    void setDate()const
    {
      _year = 2017;  
    }

    static int GetDateCount()
    {
      //Display();
      return _count;
    }
private:
    int _year;
    int _month;
    int _day;
    static int _count;
};

void setDate()const
{

  _year = 2017;  

}

这里写图片描述
5、在const修饰的成员函数中要对类的某个数据成员进行修改,该数据成员定义声明是必须加mutable关键字

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值