C++中几个关键字的解析
一、const(定义不变量)
class Test{
private:
int a;
public:
void testFunction(int b)const{
a=b;
help(b)
}
void help(int b){
a=b;
}
};
void testConst(const int _x) {
_x=5;
}
const int* testok(){
return 1;
}
int main(){
int a1=3;
const int a2=a1;
int * a3 = &a1;
const int * a4 = &a1;
int * const a5 = &a1;
int const * const a6 = &a1;
const int * const a7 = &a1;
const int *a = testok();
return 1;
}
1:修饰指针成员变量
(1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。
(2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。
(3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。
2:const修饰函数参数
传递过来的参数在函数内不可以改变,与上面修饰变量时的性质一样。
3:修饰成员函数
(1)const修饰的成员函数不能修改任何的成员变量(mutable修饰的变量除外)
(2)const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变
4:修饰函数返回值
如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改。
二、static(静态 面向对象+面向过程)
1、面向过程中的static
static void test();
static int a;
void main()
{
a=20;
cout<<a<<endl;
test();
}
void test()
{
static int a=10;
cout<<a<<endl;
}
1.1静态全局变量
该变量在全局数据区分配内存;
未经初始化的静态全局变量会被程序自动初始化为0;
静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;
静态全局变量不能被其它文件所用;
其它文件中可以定义相同名字的变量,不会发生冲突
1.2静态局部变量
该变量在全局数据区分配内存;
静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;
1.3静态函数
静态函数不能被其它文件所用;
其它文件中可以定义相同名字的函数,不会发生冲突;
2、面向对象的static
class Mytest
{
public:
Mytest(int a,int b,int c);
static void GetSum();
private:
int a,b,c;
static int Sum;
};
int Mytest::Sum=0;
void Mytest::GetSum()
{
cout<<"Sum="<<Sum<<endl;
}
2.1静态数据成员
在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员
注意:static 并不占用类的栈空间,sizeof是计算栈空间大小。
有如下特性:
(1)静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。
(2)对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;
(3)静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。
2.2静态成员函数
非静态成员函数可以访问静态数据成员
静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;
静态成员函数不能访问非静态成员函数和非静态数据成员;
有不正之处欢迎指正,不胜感激 比心(ylucas923@gmail.com)