超详细的const 指针与指向const的指针 |
您所在的位置:网站首页 › 指针变量可以指向指针变量吗 › 超详细的const 指针与指向const的指针 |
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #include
using namespace std;
int main(int argc, char *argv[])
{
int a=3;
int b;
/*定义指向const的指针(指针指向的内容不能被修改)*/
const int* p1;
int const* p2;
/*定义const指针(由于指针本身的值不能改变所以必须得初始化)*/
int* const p3=&a;
/*指针本身和它指向的内容都是不能被改变的所以也得初始化*/
const int* const p4=&a;
int const* const p5=&b;
p1=p2=&a; //正确
*p1=*p2=8; //不正确(指针指向的内容不能被修改)
*p3=5; //正确
p3=p1; //不正确(指针本身的值不能改变)
p4=p5;//不正确 (指针本身和它指向的内容都是不能被改变)
*p4=*p5=4; //不正确(指针本身和它指向的内容都是不能被改变)
return 0;
}
const用法小结:const最常用的就是定义常量,除此之外,它还可以修饰函数的参数、返回值和函数的定义体。1. const修饰函数的参数如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能。const 只能修饰输入参数:如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地改动该指针,起到保护作用。将“const &”修饰输入参数的用法总结如下:(1)对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。(2)对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。 2. const 修饰函数的返回值如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如函数const char * GetString(void);如下语句将出现编译错误:char *str = GetString();正确的用法是const char *str = GetString();如果返回值不是内部数据类型,将函数A GetA(void) 改写为const A & GetA(void)的确能提高效率。但此时千万千万要小心,一定要搞清楚函数究竟是想返回一个对象的“拷贝”还是仅返回“别名”就可以了,否则程序会出错。函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。例如: class A { A & operate = (const A &other); // 赋值函数 }; A a, b, c; // a, b, c 为A 的对象 a = b = c; // 正常的链式赋值 (a = b) = c; // 不正常的链式赋值,但合法如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动。上例中,语句 a = b = c 仍然正确,但是语句 (a = b) = c 则是非法的。 3. const修饰成员函数关于Const函数的几点规则:a. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.b. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.c. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.d. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改,自然此时的const成员函数是可以修改它的 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |