1.常变量

  const int i = 10;    
  int const i = 10;

两种表达方式没区别

2.指针与const

  • 如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
  • 如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
  • 利用英文从右边往左边读,并且以to为分界,to之前为描述指针的特性,to之后为描述目标的特性

指针常量: 指向常量的指针

const int *a;
int const *a;

1.对于指向常量的指针,不能通过指针来修改对象的值。
2.不能使用void*指针保存const对象的地址,必须使用const void*类型的指针保存const对象的地址。
3.允许把非const对象的地址赋值给const对象的指针,如果要修改指针所指向的对象值,必须通过其他方式修改,不能直接通过当前指针直接修改。
eg:
    const int p = 10; //定义一个常量
    const void * vp = &p;//将这个常量地址付给这指向常量的指针
	int val = 3;
	ptr = &val; // ok,指针可以改变自己的指向
	*ptr=4;//error,不能通过指针来修改对象的值

常指针:const指针不能修改指向

int* const a;

eg:
    int num=0, num1=1;
    int * const ptr=# // const指针必须初始化!且const指针的指向不能修改
    ptr = &num1; // error! const指针不能修改指向!
	*ptr=1;//ok,const指针指向的值能修改

指向常量的常指针

const int* const a;

3.类函数中的const

const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.

int Apple::add(int num) const
int Apple::add(int num) 
  • Apple对象可以访问add()和add() const;
  • const Apple对象只能访问add() const;

在一个类中,任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改 数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性

类中常量

不能在类声明中初始化 const 数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道 SIZE 的值是什么。(c++11标准前)

class A 
{
  const int SIZE = 100;   // 错误,企图在类声明中初始化 const 数据成员 
  int array[SIZE];  // 错误,未知的 SIZE 
};
根本原因:const的生命周期在对象A创造之前是不存在的。

正确做法

class A 
{
  A(int size);  // 构造函数 
  const int SIZE ;    
}; 
A::A(int size) : SIZE(size)  // 构造函数的定义
{ 

} 
A  a(100); // 对象 a 的 SIZE 值为 100 
A  b(200); // 对象 b 的 SIZE 值为 200 

cosnt static 常量 可以解决生命周期的问题

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。