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 value;
const 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关键字