C++ const学习总结(不整理还真觉得有些乱)

const对象

可以将const对象,赋值给同类型的普通对象,当不能将普通对象,复制给const对象。

1
2
3
4
const int a = 3;
int b = a;  // ok
int c = 4;
a = c;      // error

在全局作用域声明的const对象默认为文件的局部变量,不能被其他文件访问。非const变量默认为extern。要使const变量能够在其他文件中访问,必须指定它为extern。

const形参

如,void fcn(const int i) {},实参传递时以副本的形式传递,因此传递给fcn的对象既可以是const对象,也可以是非const对象。

在C语言中const形参或非const形参无区别。为了兼容C语言,编译器会将fcn的定义视为普通的int型,即void fcn(int i) {}

** 仅当形参是引用或指针时,形参是否为const才有影响。

定义const来重载函数是合法的,编译器可以根据const确定调用哪一个函数:

1
2
Record lookup(Account&);
Record lookup(const Account&); // new function

const指针,与指向const对象的指针

这种区别,可以采用从右向左的读法去判别。

1
2
3
4
// a是指向const int类型的指针
const int *a;
// a是常指针,执行int类型的对象。
int *const a;

允许把非const对象的地址,赋值给const对象的指针,如:

1
2
double dval = 3.14;
const double *cptr = &dval;   // 操作是ok的,但是不能通过cptr来修改dval的值

不允许将指向const对象的指针赋值给指向普通对象的指针

1
2
const int *a = &i;
int *b = a;         // error, a指向const int类型,其指向的值不允许被修改,因此赋值会产生错误。

const成员函数(常量成员函数)

const改变了隐含的this形参的类型,this为指向const对象的指针,只能读取而不能修改调用它们的对象的数据成员。

1
2
3
4
void SimpleClass::Test() const
{
  this->simpleData = 5;   // error, this为指向const的SimpleClass的对象的指针
}

还需注意

const对象、指向const对象的指针或引用只能用于调用其const成员函数,不能调用非const成员函数。