面试题目:1、题 int i=10; const int*p = &i; int *const* p = &i; const在不同位置有什么不
同
2、const 修饰类成员变量是有什么特殊要求
3、const 修饰类成员函数会发什么
4、const 对象有什么意义
前言
对于任何语言设定限定符为了是程序设计者不破坏其语言设定的基础规则,使程序能够安全运行和稳定运行。本文对C++ 中const限定符做详细的解析。
一、const的意义
有时候我们希望我们定义的变量,希望它的值不能被修改,只能被使用;另一方面也随时保证警惕防止程序或其他设计者一不小心改变这个值,为了满足这一要求就通过const关键字加以限定
二、const使用规则
1.初始化
const 修饰的变量在初始化就需要赋初值
const int i = 10;
const char* p = " big bird";
const 初始化时允许任意表达式作为初始值
const int r1 = 40;
const int r2 = r1*50;
const引用的时候允许类型转换
const double i = 3.14;
const int &r1 = i;
其实实际程序做了隐形操作,建立了一个临时变量,真正的执行过程如下:
const double i = 3.14;
const int &r1 = i; //隐形操作
const int temp = i; //隐形操作
const int &r1 = temp;
2.const 修饰指针
指针是对象而不是引用,因此它能像其他对象类型一样,允许把指针本身定义为常量。常量指针必须被初始化
int errorNum = 0;
int *const currErr = &errorNum; //就是currErr不能指向其他地址,顶层const
const int *p = &errorNum; //currErr可以指向其他地址,底层const,可以改变
//currErr所指向的内容
const double pi = 3.1415926;
const double *const pip = π //双保险,地址指向和内容都不能修改
const 修饰指针时 如果本身是常量,这是顶层const,如果指针可以改变就是底层const
如果以上不好理解,那么可以通过取巧的记忆方法:
1)const靠近谁,谁就是常量
const靠近类型,值就不改变,是底层const,const靠近 * 表明指针不能改变,顶层const,如下:
const int *p = &errorNum;
int *const currErr = &errorNum;
2)或者 左边的是底层const,靠近右边的是顶层const
三、const使用限制
int i=0;
int *const p = &i;
int* p1 = p; //错误,p是常量类型,无法赋值
const int a = 10;
int &r = a; //错误,a是常量,不能被引用成普通变量
四、const类相关
1、定义数据成员
class A
{
private const int i;
public A(int a);
}
class A:A(int a):i(a)
{
}
类的数据成员为常量,那么就要在构造函数中初始化列表中初始化它,不能在构造函数中初始化
2、定义常量函数
class A
{
private string name;
public A(string name);
public string getName()const;
public const string& getNameEx();
}
A:A(string n):name(n)
{
}
//表明该函数中不能修改成员变量
string A:getName()const
{
return name;
}
//表明返回值是常量
const string& A::getNameEx()
{
return name;
}
如果const修饰返回值,那么返回值是常量,如果修饰的在函数声明后面,那么说明在该函数中不能修改成员变脸的值
3、定义const 对象
在 C++ 中,const 也可以用来修饰对象,称为 常对象 。 一旦将对象定义为常对象之后,就只能调用类的 const 成员(包括 const 成员变量和 const 成员函数)了。
const A* pA = new A("xiaoming");
pA->getName(); //正确,getName是常量成员函数
pA->getNameEx(); //错误,getNameEx不是常量成员函数