C++中几个关键字的解析

来源:互联网 发布:淘宝清退是什么意思 编辑:程序博客网 时间:2024/06/05 02:03

C++中几个关键字的解析

一、const(定义不变量)

class Test{  private:    int a;  public:    void testFunction(int b)const{        a=b;     //错误,在const成员函数中,不能修改任何类成员变量        help(b)  //报错,const成员函数不能调用非onst成员函数,因为非const成员函数可以会修改成员变量    }    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; //修饰成员变量,a2不可改变    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();     ///int *b = mallocA();  ///编译错误 返回是什么就应该用什么去接收    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<<a<<endl; //错误代码,a是非静态数据成员   cout<<"Sum="<<Sum<<endl;}
2.1静态数据成员
在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员注意:static 并不占用类的栈空间,sizeof是计算栈空间大小。有如下特性:(1)静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。(2)对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。也就是说,静态数据成员是该类的所有对象所共有的。对该类的多个对象来说,静态数据成员只分配一次内存,供所有对象共用。所以,静态数据成员的值对每个对象都是一样的,它的值可以更新;(3)静态数据成员存储在全局数据区。静态数据成员定义时要分配空间,所以不能在类声明中定义。
2.2静态成员函数
非静态成员函数可以访问静态数据成员静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静态数据成员;
有不正之处欢迎指正,不胜感激 比心(ylucas923@gmail.com)
原创粉丝点击