【C++ const】

const 参考

1. 分类

常变量: const 类型说明符 变量名
常引用: const 类型说明符 &引用名
常对象: 类名 const 对象名
常成员函数: 类名::fun(形参) const
常数组: 类型说明符 const 数组名[大小]
常指针: const 类型说明符* 指针名 ,类型说明符* const 指针名

const int a=5; 与 int const a=5;  等同
类名 const 对象名 与 const 类名 对象名 等同

2. 用法

1. 常量

2. 指针和常量

const指针修饰变量以下三种情况:

/* A:修饰指针指向的内容,则内容为不可变
 * B:修饰指针,则指针为不可变量
 * C:修饰指针和指针指向内容,均不可变量
*/
  // A
  int a = 8;
  int b = 3;
  const int* p = &a;
  p = &b;

  // B
  int* const p1 = &a;
  *p1 = 9;

  // C
  const int* const p2 = &a;

char *const cp; //到char的const指针
char const *pc1; //到const char的指针
const char *pc2; //到const char的指针(后两个声明是等同的)

右向左读的记忆方式:

cp is a const pointer to char
故pc不能指向别的字符串,但可以修改其指向的字符串的内容
pc2 is a pointer to const char
故*pc2的内容不可以改变,但pc2可以指向别的字符串

3. 用const修饰函数传入参数

void Fun( const A *in); //修饰指针型传入参数
void Fun(const A &in); //修饰引用型传入参数

4. 修饰函数返回值

可以阻止用户修改返回值。返回值也要相应的付给一个常量或常指针。

5. const 修饰成员函数

const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数;
const对象的成员是不能修改的,而通过指针维护的对象确实可以修改的;
const成员函数不可以修改对象的数据,不管对象是否具有const性质。编译时以是否修改成员数据为依据进行检查。

3. 展开来说

1. 常量与指针

const int *m1 = new int(10);
int* const m2 = new int(20);

只要知道:const只对它左边的东西起作用,唯一的例外就是const本身就是最左边的修饰符,那么它才会对右边的东西起作用
···

2. 常量与引用

常量与引用的关系稍微简单一点。因为引用就是另一个变量的别名,它本身就是一个常量。也就是说不能再让一个引用成为另外一个变量的别名, 那么他们只剩下代表的内存区域是否可变

const int i = 10;
// 这里i已经被定义为常量,但是我们仍然可以通过另外的方式去修改它的值。
// 这说明把i定义为常量,实际上是防止通过i去修改所代表的内存。
int *pi = (int*) &i;

3.常量函数

  常量函数是C++对常量的一个扩展,它很好的确保了C++中类的封装性。
  在C++中,为了防止类的数据成员被非法访问,将类的成员函数分成了两类,一类是常量成员函数(也被称为观察着);另一类是非常量成员函数(也被成为变异者)。
  在一个函数的签名后面加上关键字const后该函数就成了常量函数。对于常量函数,最关键的不同是编译器不允许其修改类的数据成员。例如:

4. 常量返回值

4. 使用const的一些建议

  1. 要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
  2. 要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;
  3. 在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;
  4. const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
  5. 不要轻易的将函数的返回值类型定为const;
  6. 除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;
posted @ 2021-09-14 20:32  西西果RuJ  阅读(135)  评论(0)    收藏  举报