c++ - 常量指针与指向常量的指针
2011-04-20 00:17
246 查看
这是两个初学者容易混淆的概念。比如,
T *pt = new T;
const T *pct = pt;//指向常量(const T)的指针
T * const cpt = pt;//常量指针,指向T
不过使用一个引用比使用一个常量指针更简单:
const T &rct = *pt; //不用const T* const
T &rt = *pt; //不用T* const
使用过程中,要注意三点:
1. 一个指向常量的指针可以指向一个非常量对象
2. 指向非常量的指针不可以指向常量对象 (行为未定义)
3. 一个常见的误解是,适用于指针的转换同样适用于指向指针的指针。事实上并非如此。
例如,我们知道一个指向派生类的指针可被转换为一个指向其公共基类的指针:
Circle
*
c
=
new
Circle;
Shape
*
s
=
c;
//
正确
因为Circle
是一个(
is-a
)
Shape
,因而一个指向
Circle
的指针也是一个
Shape
指针。
然而,一个指向
Circle
指针的指针并不是一个指向
Shape
指针的指针:
Circle
**
cc
=
&
c;
Shape
**
s
=
cc;
//
错误!
这里两种可以这样理解:
typedef
Circle
* LPCircle;
typedef
Shape
* LP
Shape;
LPCircle * cc = & c;
LP
Shape * s = cc;//错误,
LP
Shape和
LPCircle没有 is-a的关系
T *pt = new T;
const T *pct = pt;//指向常量(const T)的指针
T * const cpt = pt;//常量指针,指向T
不过使用一个引用比使用一个常量指针更简单:
const T &rct = *pt; //不用const T* const
T &rt = *pt; //不用T* const
使用过程中,要注意三点:
1. 一个指向常量的指针可以指向一个非常量对象
2. 指向非常量的指针不可以指向常量对象 (行为未定义)
3. 一个常见的误解是,适用于指针的转换同样适用于指向指针的指针。事实上并非如此。
例如,我们知道一个指向派生类的指针可被转换为一个指向其公共基类的指针:
Circle
*
c
=
new
Circle;
Shape
*
s
=
c;
//
正确
因为Circle
是一个(
is-a
)
Shape
,因而一个指向
Circle
的指针也是一个
Shape
指针。
然而,一个指向
Circle
指针的指针并不是一个指向
Shape
指针的指针:
Circle
**
cc
=
&
c;
Shape
**
s
=
cc;
//
错误!
这里两种可以这样理解:
typedef
Circle
* LPCircle;
typedef
Shape
* LP
Shape;
LPCircle * cc = & c;
LP
Shape * s = cc;//错误,
LP
Shape和
LPCircle没有 is-a的关系
相关文章推荐
- C++中 常量引用、指向常量的指针、常量指针的区别
- [C++基础]018_常量指针和指向常量的指针
- 【C/C++】常量指针、指针常量以及指向常量的指针常量
- C/C++ 指向常量的指针和常量指针
- C++ 指向常量的指针与常指针
- 【C/C++】常量指针、指针常量以及指向常量的指针常量
- [C++基础]018_常量指针和指向常量的指针
- 【菜鸟C++学习笔记】20.常指针&指向常量的指针&指向常量的常指针
- 重学C++ 指向常量数据的常量指针
- c++指向常量的指针和指向变量的指针常量
- C++ 常量指针 指向常量的指针
- C++指向常量的指针和常指针
- C++ 学习( 第一天)指针常量和指向常量的指针
- C++中对常量指针和 指向常量的指针等组合声明的理解
- c++中指针常量,常指针,指向常量的常指针区分
- [C][代码实例]交换指向常量的二级指针的位置
- 对C++中指向数组类型的指针的理解
- C/C++中指向结构体变量的指针,调用指向的那个结构体中的成员
- [ZZ]const常量、指向常量的指针和常量指针
- C/C++中字符指针数组及指向指针的指针的含义