c++ 变量/函数的可见性以及生存期由存储类型来确定,具体规则为:
1、auto
局部变量、函数的默认存储类型,故该关键字可以不写。如:
{
int mount;
auto int month;
}
2、register
标明为寄存器存储类型,不在内存中分配存储空间,要求高速读写的变量可声明为register的存储类型,同时要注意声明为register的变量无法被&操作(引用或取地址),因为它不存在内存中。另外,声明为register的变量在程序逻辑上是存储在寄存器中,但实质并不绝对的保存在寄存器中,这由实际硬件的实现来决定。如:
{
register int miles;
}
3、static静态存储。
(1)修饰局部变量时,该局部变量将放在静态存储区存储,生命周期为程序的生命周期。
(2)修饰全局变量时,该变量只在本声明文件中可见。
(3)修饰类成员时,该类成员将独立于类对象,由所有类对象共享。
4、extern
修饰变量/函数时,标明该变量/函数在外部定义,此处是引用该外部变量/函数的声明。
5、mutable
在类成员中使用,修饰一个类成员变量时,即使类成员函数定义为const,也可以在该成员函数中修改被mutable修饰的成员变量。如:
class Person {
public:
Person();
~Person();
int getAge() const; /*调用方法*/
int getCallingTimes() const; /*获取上面的getAge()方法被调用了多少次*/
private:
int age;
char *name;
float score;
mutable int m_nums; /*用于统计次数*/
};
Person::Person()
{
m_nums = 0;
}
Person::~Person(){}
int Person::getAge() const
{
std::cout << "Calling the method" << std::endl;
m_nums++; //m_nums被声明为mutable的存储类型,即使在const的函数中依然可以被修改。
// age = 4; 出错,age为默认的存储类型,在const的成员函数中无法被修改。
return age;
}