【c++手记】关于const的问题&资料
【问题】
const int Func(const int & const x) const ;//error!
const int Func(const int & const x) const ;//error!
【解析】
1.第一个const:(在函数中)修饰返回值
声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
(何为保护作用?如果给采用“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的所指对象不能被修改,该返回值只能被赋给加const修饰的同类型指针)
1.第一个const:(在函数中)修饰返回值
声明了返回值后,const按照"修饰原则"进行修饰,起到相应的保护作用。
(何为保护作用?如果给采用“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的所指对象不能被修改,该返回值只能被赋给加const修饰的同类型指针)
2.第二个const:(在函数中)修饰参数
用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化。
如形参为const A* a,则不能对传递进来的指针的所指对象(不是指针的值)进行改变,保护了原指针所指向的内容。
如形参为const A& a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。
3.第三个const:(由于可写可不写,忽略!)
4.第四个const:(在成员函数中)用于声明成员函数
这里是会报错的,原因在于其并非是一个成员函数!!
一般放在函数体后,形如:void fun() const;
任何不会修改数据成员的函数都因该声明为const类型。
如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非const成员函数,编译器将报错,这大大提高了程序的健壮性。
被声明为const的成员函数,则不能为static(静态函数),原因是其成员函数必须是显示或隐式包含this指针!
【问题】
const int max = 100;
const int max = 100;
【解析】
const常量有数据类型,而宏常量没有数据类型。
编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。
【问题】
class a{
private:
const int max;
}
class a{
private:
const int max;
}
【解析】
const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。
因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。
所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么。
const数据成员的初始化只能在类的构造函数的初始化表中进行
【问题】
1)const int *a;
2)int const *a;
3)int* const a;
4)const* int const a;
1)const int *a;
2)int const *a;
3)int* const a;
4)const* int const a;
【解析】
1.const在*号左边:1)2)
const就是用来修饰指针所指向的变量,即指针指向为常量
2.const在*号右边:3)
const就是修饰指针本身,即指针本身是常量
3.第四种情况就是1+2
【资料1】
《primer》-P49 const限定符
【内容1】
1.const限定符提供了一个解决方案,将一个对象转换为常量。
2.a 全局作用域里定义非const变量时,它在整个程序中都可以访问(必要的声明头文件)!
b 而在全局作用域声明的const变量是定义该对象的文件的局部变量,若通过指定const变量为extern,就可以在整个程序中访问const对象。
//------------------------------------------------------------------------
【资料2】
《primer》-P51 const引用
【内容2】
const引用是指向const对象的引用。
例如:
const int ival = 1024;
const int &refVal = ival;
可以读取但不能修改refVal。即不能通过修改refVal来修改iVal.同理int &ref2 = ival 是不合法.
//------------------------------------------------------------------------
【资料3】
《primer》-P110 指针与const限定符
【内容3】
c++强制要求:指向const对象的指针必须具有const特性。即:
const int ival =1024;
int ival2
const int* ivalPointer = &ival;//ok
int* ivalPointer2 = &ival;//error
const int* ival2Pointer = &ival2;//ok
//------------------------------------------------------------------------
【资料4】
《primer》-P111 const指针
【内容4】
例如:
int *const curErr = &errNumb;
读作curErr指向int型对象的const指针。
const指针的值不能修改,故意味着curErr不能指向其他对象。
//------------------------------------------------------------------------
【资料5】
《primer》-P112 指向const对象的const指针
【内容5】
例如:
const double *const pi_ptr = &pi//pi is a const object
混合const指针和指向const对象的指针。即不能修改pir_ptr所指向的对象的值,也不允许重定向pir_ptr指针指向。
//------------------------------------------------------------------------
【资料】
const作为成员函数修饰时&纯虚函数!