`

“指向const对象的指针”和“const指针”

    博客分类:
  • C++
阅读更多
const是C++中引入的一个新的关键字,它为C++编程带来了很大的方便。指向const对象的指针和const指针是两个名字很接近的概念,对于初学者来说非常容易搞混,这里对它们进行区分。
  指向const对象的指针
  可以这样理解指向const对象的指针:
  指向const对象的指针就是一个指针,不能通过它来修改它所指向的对象的值
  · 声明方法:const int *p;
  const对象在初始化后是不允许对其值进行修改的,因此,我们不能用一个普通指针指向一个const对象,即下面的赋值会引起编译错误:
  const int i = 1;
  int *p = &i;
  否则的话,我们就可以利用普通指针来修改一个const对象的值,那么const也就毫无意义了。
  正确的方法是利用一个指向const对象的指针来获取const对象的地址:
  const int i = 1;
  const int *p = &i;
   这样,利用指向const对象的指针也是不能修改它所指向的const对象的值的。
  需要注意的两点:
  指向const对象的指针本身不是const类型(这也是它与const指针的主要不同点),所以它可以指向另一个const对象
  指向const对象的指针可以被赋予一个非const对象的地址,但是此时试图通过此指针来修改对象的值的操作是非法的
  2. const指针
  可以这样理解const指针:
  const指针就是一个指针,它本身就是const类型,所以将它初始化后不能再改变它的指向,即不能让它指向一个新的对象
  声明方法:
  int *const p;//指向非const对象的const指针
  const int *constp;//指向const对象的const指针
  由以上声明方法可以看出,const指针可以指向const对象和非const对象,但是两者的声明方法是不同的。
  使用const指针不可以修改其地址值,但是const指针指向非const对象,就可以利用它修改它所指向的对象的值。
  总结:
  初学者之所以会混淆两者的根本原因是他们头脑中的一些隐式假定在作怪,也就是说想当然地给要分析的对象强加上一些它们原本并不存在的属性,这是很多人在处理问题时很容易犯的一个通病。只要语法规则没有明确说明是非法的,我们就可以拿来用,而没有必要人为地加上种种限制。其实要弄清两者的区别,只要明确两点就够了:
  指针本身是const型还是非const型
  指针所指向的对象是const型还是非const型
  const型变量的值在初始化后是不允许改变的(这是根本),那么const指针其指向是不能变的,const对象其值是不能变的,一切都清楚了
  2.要弄清楚上面的两个问题,有一个很简单的办法:
  如果指针名前紧邻的关键字为const,那么它就是一个const指针;如果声明指针所指向的对象类型前有const关键字,那么它就是一个指向cosnt对象的指针。  应用上面的判断方法,const int *const p; 就表示指向const对象int的const指针。


    int b = 500;
const int* a = &b;    [1]
int const *a = &b;   [2]

int* const a = &b;   [3]
const int* const a = &b; [4]
如果你能区分出上述四种情况,那么,恭喜你,你已经迈出了可喜的一步。不知道,也没关系,我们可以参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 ;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常量。
另外const 的一些强大的功能在于它在函数声明中的应用。在一个函数声明中,const 可以修饰函数的返回值,或某个参数;对于成员函数,还可以修饰是整个函数。有如下几种情况,以下会逐渐的说明用法:
A& operator=(const A& a);
void fun0(const A* a );
void fun1( ) const;    // fun1( ) 为类成员函数
const A fun2( );
分享到:
评论

相关推荐

    详细分析c++ const 指针与指向const的指针

    C++ 编程语言中,const 指针和指向const的指针是两个容易混淆的概念,但它们有着不同的定义和使用场景。在本文中,我们将详细分析 C++ const 指针和指向const的指针,帮助读者更好地理解和学习这两个概念。 const ...

    const与指针的关系

    3. **指向常量的常指针(Const Pointer to Const)**: - 定义格式:`const int *const a = &b;` - 这种类型的指针表示指针本身及其指向的内容都是常量,即既不能改变指针的指向,也不能通过该指针修改其指向的...

    CONST指针指针

    这种情况是`const`同时修饰指针和指针所指的变量,两者都不能改变。例如: ```c const int* const pi = &a; // pi和*a都是常量 *pi = j; // 错误,*pi是常量,不能修改 pi = &j; // 错误,pi是常量,不能改变 ...

    const 与 指针

    如果`const`位于指针类型和星号之间,那么`const`修饰的是指针所指向的对象。 理解`const`与指针的关系,可以帮助我们编写更安全、更易维护的代码。在分析问题时,应明确指针的`const`属性和它所指向的对象的`const...

    函数指针和指针函数,const的用法,指针常量,常量指针的用法

    ### 函数指针和指针函数的区分及应用 #### 函数指针的理解与使用...通过以上介绍,我们可以看出函数指针和指针函数有着本质的区别,同时正确使用 `const` 可以帮助我们更好地控制程序的行为,提高程序的安全性和效率。

    虚函数与const指针

    虚函数与const指针 虚函数是C++多态的一种表现形式。虚函数是基类的非静态成员函数,其访问权限可以是 protected 或 public。...在使用虚函数时,需要正确地使用const指针和指向const的指针,以避免出现错误。

    C语言中Const指针变量(常指针)

    C语言中的const指针变量是一种特殊的指针,它用于确保指针所指向的值不会被修改。但是,const指针变量的概念经常被混淆,理解其工作原理对于学习C语言非常重要。 首先,我们可以根据const关键字的位置区分两种常...

    const 指针

    <类型> const * <指针变量> 或 const <类型> * <指针变量> 2、常量指针: <类型> * const <指针变量> 3、指向常量的常量指针: <类型> const * const <指针变量> 或 const <类型> * const <指针变量>

    第六章答案对象的指针、this指针、const、new和delete.docx

    - 指向对象成员的指针则分为两种:指向数据成员的指针和指向成员函数的指针。前者用于指向类的特定数据成员,定义格式为:`<类型> <类名>::* <指针名> = <初值>`;后者用于指向类的特定成员函数,定义格式为:`...

    const指针的使用

    ### const指针的使用 #### 一、const指针概述 在C++中,`const`关键字被广泛用于控制变量的可修改性以及提高代码的安全性和效率。当与指针结合时,`const`可以有不同的含义,具体取决于它在声明中的位置。下面将...

    深入理解const 与指针

    这些组合的不同之处在于 const 的位置和修饰的对象不同。 二、理解助记法宝: 要理解 const 和指针的组合,需要记住两个关键点: 1. 关键看 const 修饰谁。 2. 由於没有 const* 运算,若出现 const * 的形式,则 ...

    第六章答案对象的指针、this指针、const、new和delete.pdf

    2. **指向对象成员的指针**:这种指针分为两种类型:指向数据成员的指针和指向成员函数的指针。数据成员指针的定义如`Type ClassName::*pointerName = &ClassName::dataMember;`,成员函数指针的定义则如`Type ...

    C++中指向对象的常指针与指向常对象的指针详解

    将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初始值,不能改变。 代码如下:Time t1(10,12,15),t2;Time * const ptr1=&t1;ptr1=&t2;定义指向对象的常指针的一般形式为 类名 * const ...

    const int *a int * const a区别实例

    这里,a 是一个指向整型常量的指针,指向的对象不能被修改,但指针 a 可以指向另一个常量。例如: ```cpp const int *a = &b; a = &c; // ok! *a = 2; // error! ``` const 指针的 const const 指针的 const 是指...

    理解复杂的CC++声明 const, typedef , 函数指针

    const指针是一种指针,它的值不能被改变。例如:int * const p=&n;,这里declare p as a const pointer to an int,p的值不能被改变,但*p的值可以被改变。 十、总结 本文总结了复杂的C/C++声明,包括const、...

    20121022_动态分配const对象(C++)1

    在这个表达式中,`type`是你要创建的const对象的类型,`value`是初始化对象的值,`pointer`是一个指向const对象的指针。例如,创建一个不可变整数并赋值为128的代码如下: ```cpp const int *p = new const int(128)...

    C++const关键字详解

    3. **指向const的const指针**:这种指针不仅其指向的内容是常量,而且指针自身也是常量。例如: ```cpp const int *const cp = &i; ``` 这里`cp`是一个指向`int`类型的`const`对象的`const`指针,既不能修改所...

    const T vs. T const

    // ptr是一个const指针,即指针本身的值(所指向的地址)不可改变,但可以通过ptr修改它所指向的int值。 ``` 而当我们用typedef定义一个新的类型名称时,const关键字的位置就显得尤为重要。如文章中所述的例子: ...

Global site tag (gtag.js) - Google Analytics