本文总结C++中的部分关键字的用法。

1 C++中的部分关键字的用法

1.1 const的用法

1.1.1 定义常量

使用const修饰的变量的值不可改变。

1
const double PI = 3.1415;

1.1.2 const与指针

  1. 指向常量的指针(point to const)
    定义方法: const int *p; int const *p;
    指向常量的指针的特点:const在*前面,不论它在类型前还是类型后作用相同。
    指向常量的指针的特点:
  • 不能通过指针改变所指向的数据
  • 指针本身的内容可以改变
  • 指针指向的内容可以是常量也可以不是常量
  • 指针所指向的内容若为非常量,也可以改变

示例如下:

1
2
3
4
5
6
7
int a = 100;
int b = 50;
const int *point1 = &a; //定义指针常量
//*point1 = 50; //非法操作,不能通过指针变量来改变所指向的数据

a = 50;      //改变指针常量所指内容的值
point1 = &b; //改变指针常量的值
  1. 常量指针(const pointer)
    定义方法: int *const p;
    常量指针就是该指针为常量。因为该指针为一个常量,因此指针的值不能改变。 常量指针的特点:
  • 常量指针必须初始化
  • 一旦初始化后,指针的内容就不能改变
  • 指针所指向的内容可以改变

示例如下:

1
2
3
4
5
6
int a = 100;
int b = 50;
int *const point2 = &b; // 定义常量指针
//point2 = &a;          //非法操作,不能更改常量指针的值

b = 100; // 可以改变常量指针所指内容的值
  1. 指向常量的常指针
    定义方法: const int *const p;
    指向常量的常指针为前面两种情况的综合。因此既不能通过指针变量来改变所指向的数据,也不能更改指针本身的值。 指向常量的常指针:
  • 指针本身的内容不能改变
  • 不能通过指针改变指针所指向的内容
  • 若指针指向的内容为非常量,则指针指向的内容可以改变

示例:

1
2
3
4
5
6
int a = 100;
int b = 50;
int c = 80;
const int *const point3 = &c; //定义指向常量的常量指针
*point3 = a; //非法操作,不能通过指针变量来改变所指向的数据
point3 = &b; //非法操作,不能更改常量指针的值

1.1.3 函数形参

const修饰函数形参,函数中不能修改const形参对应的实参。例如:

1
void func(const vector<int>& vec);

1.1.4 const修饰函数返回值

1.1.5 类相关的const

  • 常量成员变量:常成员变量只能通过列表初始化的方式初始化。此后,其值不可改变。
  • const修饰成员函数:const修饰的成员函数不能修改类中成员变量的值;不能调用非const修饰的成员函数。
  • const修饰对象,对象指针(引用):const修饰的对象只能调用cosnt修饰的成员函数。

1.2 static的用法

1.2.1 静态全局变量

  • 该变量在全局数据区分配内存;
  • 未经初始化的静态全局变量会被程序自动初始化为0;
  • 静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;

1.2.2 静态局部变量

  • 该变量在全局数据区分配内存;
  • 静态局部变量在程序执行到该对象的声明处时,首次进行初始化;以后的函数调用不再进行初始化;
  • 静态局部变量一般在声明处初始化,如果没有显式初始化会被程序自动初始化为0;
  • 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;

1.2.3 静态函数

静态函数不能被其它文件所用;其它文件中可以定义相同名字的函数,不会发生冲突

1.2.4 类内静态成员

1.2.4.1 静态数据成员

  • 类中的静态成员与类本身直接相关。而不是与类的各个对象保持关联。类的静态数据成员是属于整个类,而不与任何对象绑定;
  • static关键字只能出现在类内部声明语句中;
  • 类的静态成员存在于任何对象之外,对象中不包含任何与静态数据有关的数据;
  • 静态成员变量使用前必须先初始化;
  • 静态数据成员不能由类的构造函数初始化;
  • 静态数据成员一般应在类的外部初始化。当静态数据成员为静态常量(const static)时,可以在类内初始化。
  • 静态数据成员只能定义一次。

1.2.4.2 静态成员函数

  • 类的静态成员函数也不与任何对象绑定,也不包含this指针。
  • 静态成员函数不能声明为const,也不能在static函数体内使用this指针。
  • 静态成员函数不能使用非静态成员函数,非静态成员函数可以使用静态成员函数。