C++ static和const整理

前言

前面刚刚整理了一下new和const的关系 ,突然觉得static和const也是面试的时候一个比较常问的方面,现在也来稍微整理下。

static整理

static用法

  1. static修饰普通变量,修改变量的存储区域和生命周期,是变量存储在静态区,在main函数运行前就已经分配了空间,如果有初始值就用初试值初始化,没有就使用系统默认初值。
static int m, n;
static int *a;
int main(){
cout << m << " " << n;
cout << *a;
return 0;
}

在不赋初值时默认为0,指针默认为NULL;打印看不到任何结果

normal_const

  1. 修饰普通函数,表明函数的作用范围,只有定义在该函数的文件内才能使用,在多人开发的项目中为了防止命名空间中的函数重名,可以加上static

  2. 修饰成员变量时,所有的对象只保存一个该变量,并且不需要生成对象就可以访问该变量。
    举个例子如下:

    class A{
    public:
    static int a;
    int b;
    A(){
        b = 3;
    }
    };
    int A::a = 5;
    
    int main(){
    
    cout << A::a<<" ";
    A c;
    cout << c.b;
    return 0;
    }

static2

需要注意静态成员变量必须在类外初始化,值得注意的是,如果不初始化静态成员变量,将会报错(使用mingw编译)。而他的性质也符合类中的public private和protected的性质,需要注意的是他不属于类,是一个全局变量。
其实从代码也可以看出,是在类外初始化,他所占的内存是不变的。

  1. 修饰成员函数,使得成员函数不需要生成对象就可以访问该函数,但是static成员函数中无法访问this指针。也就是无法访问其他非静态成员。稍加思考也可以理解,静态成员函数。本身也不属于类。但是还是有一点很重要,static成员也可以通过对象进行访问,也就是说可以通过对象进行访问,也可以不通过对象进行访问,只要是已经初始化过。
#include<iostream>
using namespace std;
class A{
    public:
    static int a;
    int b;
    A(){
        b = 3;
    }

    static void fun(){
        cout << "this is fun" << endl;
    }
};
int A::a = 5;

int main(){
    cout << A::a<<" ";
    A::fun();
    A c;
    cout << c.b<<" "<<c.a;
    c.fun();
    return 0;
}

结果如下:
static3

const 整理

const用法

  1. 修饰变量,说明该变量不可以被改变
  2. 修饰指针,分为指针常量和常量指针
  3. 常量引用,经常用于形参类型,即避免了拷贝,有避免了对值的修改
  4. 修饰成员函数,说明该成员函数不能修改成员变量。

举例如下:

// 类
class A
{
private:
const int a;                // 常对象成员,只能在初始化列表赋值

public:
// 构造函数
A() : a(0) { };
A(int x) : a(x) { };        // 初始化列表

// const可用于对重载函数的区分
int getValue();             // 普通成员函数
int getValue() const;       // 常成员函数,不得修改类中的任何数据成员的值


void function()
{
// 对象
A b;                        // 普通对象,可以调用全部成员函数、更新常成员变量
const A a;                  // 常对象,只能调用常成员函数
const A *p = &a;            // 常指针
const A &q = a;             // 常引用

// 指针
char greeting[] = "Hello";
char* p1 = greeting;                // 指针变量,指向字符数组变量
const char* p2 = greeting;          // 指针变量,指向字符数组常量
char* const p3 = greeting;          // 常指针,指向字符数组变量
const char* const p4 = greeting;    // 常指针,指向字符数组常量
}

// 函数
void function1(const int Var);           // 传递过来的参数在函数内不可变
void function2(const char* Var);         // 参数指针所指内容为常量
void function3(char* const Var);         // 参数指针为常指针
void function4(const int& Var);          // 引用参数在函数内为常量

// 函数返回值
const int function5();      // 返回一个常数
const int* function6();     // 返回一个指向常量的指针变量,使用:const int *p = function6();
int* const function7();     // 返回一个指向变量的常指针,使用:int* const p = function7();

总结

static 和const中还是有很多容易混淆的东西,不过多写之后就会慢慢记住了。