c/c++关键字static和const

c/c++关键字static和const


一、关键字static

参考:https://www.cnblogs.com/BeyondAnyTime/p/2542315.html


1. 静态全局变量和函数

  • 生命周期(整个程序运行过程)不变,作用域限制在本文件中,全局变量在别的文件加extern 无效,别的文件即使include头文件也不能使用该头文件中的静态函数。
//静态全局变量
static a;

//静态函数
static void myFunc()
{
    printf("this is a static function")
}

2. 静态局部变量

  • 生命周期改变(由函数运行过程变为整个程序运行过程),作用域不变(函数内部有效)。且静态局部变量只执行一次内存分配,只进行一次初始化。
//静态局部变量
//每次调用该函数a都会加1,不会被重新初始化为0。
void myFunc()
{
    static int a=0;
    a++;
}

3. 静态类成员变量和函数

  • 静态类成员变量属于整个类,对于该类的所有对象只维持一份拷贝。
  • 静态类成员函数属于整个类共有,这个函数不接受this指针,且只能访问类的静态成员。
//类
class MyClass
{
    //声明静态成员变量
    static int a;
    //声明静态类成员函数
    static void myFunc();
};
//定义并初始化静态成员变量
int MyClass::a=0;
//定义静态成员函数时不用加static
void MyClass::myFunc()
{
}

二、关键字const

参考:https://www.cnblogs.com/icemoon1987/p/3320326.html


1. const变量

  • const 变量值是只读的,不能被改变,必须同时进行初始化。
//声明并初始化
const int a=20;

2. const 指针

  • const 指针分为三种,分别是:指针指向的内容不能变,指针地址不能变,两者都不能变,就近原则。
//指针指向的内容不能变
const int * a;
int const *a

//指针地址不能变
int * const a

//指针指向的内容和指针地址都不能变
const int * const a;

3. const修饰函数参数

  • 将函数参数声明为 const 类型,表示对于函数来说,这个参数是一个 const 变量。函数内部不能够改变这个参数的值。
  • 将函数参数声明为 const 类型的指针 ,允许上层使用“指向 const 变量的指针” 或“普通指针”作为参数,调用函数。(如果函数参数声明的是普通指针,则不允许使用指向 const 变量的指针作为参数调用)
// const变量作为函数参数
void myFunc( const int a )
{
    a = 5;  // 编译错误:不允许修改const变量
    printf("a = %d\n", a);
}

// const指针作为函数参数
void myFunc( const int *a )
{
    *a = 5;  // 编译错误:不允许修改const指针
    printf("*a = %d\n", *a);
}

4. const 修饰返回值

  • 函数的返回值为一个 const 变量,不能被修改。主要用于函数返回const引用。
// 返回 const 引用的函数
const int& myFunc(int a)
{
    return a;
}

int main( int argc, char *argv[])
{
    myFunc(2)=3; // 编译错误,返回的引用为 const 引用,不允许修改。
}

4. const对象

  • const类对象指的是该对象对象不能改变任何成员变量的值(不能直接改变成员变量
    也不能通过成员函数改变成员变量),不能调用任何非const成员函数
//实例化const对象
 const MyClass object;

5. const成员变量和成员函数

  • const 成员变量指的是类中的成员变量为只读,不能够被修改(包括在类外部和类内部)。const 成员变量必须被初始化(在相关构造函数的初始化列表中),初始化后,不能够被修改。静态 const 成员变量需要在类外部单独定义并初始化(可定义在头文件)
  • const成员函数指的是,此函数不应该修改任何成员变量,除非成员变量被 mutable 修饰符修饰。传给const成员函数的this指针,是指向 const 对象的const 指针。
class MyClass
{
public:
    MyClass() {};
    ~MyClass();

    const int c;             //const成员变量
    static const  int sc;    //static const 成员变量

    int not_m;        // 不带 mutable 修饰的成员变量
    mutable int m;    // 带 mutable 修饰的成员变量

    void myFunc(int a);                // 非 const 成员函数
    void myFunc_const(int a) const;    // const 成员函数
};

const int MyClass::sc = 1;  // 静态常量成员需要在类外进行单独定义和初始化

MyClass::MyClass(): c(10){}  // const 成员变量在构造函数初始化列表中初始化

void MyClass::myFunc(int a)
{
    not_m = a;    //正确
    m = a;        //正确
    c = a;        //编译错误,const 成员变量不能被修改
    return;
}

void MyClass::myFunc_const(int a) const
{
    not_m = a;    // 编译错误,const 成员函数不能修改一般的成员变量
    m = a;        // 正常,const成员函数能修改被 mutable 修饰的成员变量
    return;
}

猜你喜欢

转载自blog.csdn.net/Wang_Jiankun/article/details/80782194