[转]const修饰指针
文章作者:[url=http://blog.csdn.net/gnuhpc/]gnuhpc[/url]原文出处:[url]http://blog.csdn.net/gnuhpc/archive/2009/10/01/4625995.aspx[/url]
[size=7]c++ is on the way 4[/size]
[size=5]问题:动态内存分配和指针之间怎么使用?[/size]
使用new,返回的内存从所谓堆(heap),即由C++运行时管理的内存区域开始分配,如何访问呢?就是使用指针,例如,[code]int *pNumber =new int(2001);
Star *pStar = new Star(1234.5,10.2);[/code]当分配一个带有构造函数的对象时,初始化是强制性的。即使一个对象没有显式构造函数,编译器也可能不得不生成一些代码来构建它:
[list=1]
[*]若一个类没有有效的构造函数,编译器将产生一个缺省的无参数构造函数;
[*]若一个类有一个显式定义的无参数构造函数,则就在分配的时候调用;
[*]若一个类只有一个带参数的构造函数,比如叫做CBody类,则CBody *bodes = new CBody[100];编译器将不予编译。
[/list]
所以在定义CBody的时候可以使用如下的构造函数:[code]CBody (double mass =0.0):_mass(mass){}[/code]这等价于具备参数个数为0和1的两个重载构造函数。
为了释放则使用delete,例如,delete pNumber;若有析构函数则自动调用,例如,delete pStar;
若想删除数组则在其前边放上[],例如:[code]delete [] pNumbers;[/code]删除一个空指针是安全的,所以在调用delete前不需要检查是否为空指针。
[size=5]问题:如何实现链表?[/size]
List.h[code]#if !defined (LIST_H)
#define LIST_H
// (c) Bartosz Milewski 2000
class Link
{
public:
Link (Link* pNext, int id)
: _pNext (pNext), _id (id) {}
Link * Next () const { return _pNext; }
int Id () const { return _id; }
private:
int _id;
Link * _pNext;
};
class List
{
public:
List (): _pHead (0) {}
~List ();
void Add ( int id );
Link const * GetHead () const { return _pHead; }
private:
Link* _pHead;
};
#endif[/code]List.cpp[code]// (c) Bartosz Milewski 2000
#include "List.h"
#include <iostream>
List::~List ()
{
// free the list
while ( _pHead != 0 )
{
Link* pLink = _pHead;
_pHead = _pHead->Next(); // unlink pLink
delete pLink;
}
}
void List::Add ( int id )
{
// add in front of the list
Link * pLink = new Link (_pHead, id);
_pHead = pLink;
}
int main ()
{
List list;
list.Add (1);
list.Add (2);
std::cout << "List contents:\n";
for (Link const * pLink = list.GetHead();
pLink != 0;
pLink = pLink->Next ())
{
std::cout << pLink->Id() << ", ";
}
std::cout << std::endl;
}[/code]我们要注意区分的是指向常量的指针和常量指针,前者所指向的想对象不能通过此指针来修改,后者则表示一旦初始化,就不能指向其他任何对象。[code]Link const *pLink;//指向常量的指针
Link * const pLink = pInitPtr;//常量指针[/code]可以组合为指向常量的常量指:[code]Link Const * const pLink=pInitPtr;[/code]我们从右往左念,星号表示“指向一个”,这样就好理解记忆了。 这篇文章是原作者在学习C++时的笔记。原文的题目是《c++ is on the way 4》,我对最后描述const修饰指针的那段比较敢兴趣,所以就修改了一下标题。
用const来修饰指针时,我也有一些个人的体会:放到自然语言中,const的作用属于一个形容词,用于修饰后面的名词短语。因此,只要不给后面的[b]名词短语[/b]赋值即可
比如:
int const [color=Red]* icp[/color] = &i;
int * const [color=Red]ipc[/color] = &j;
其中红色部分是const修饰的名词短语,因此下面两个赋值语句都是错误的:[code]*icp = 3; // error: assignment of read-only location ‘*ipc’
ipc = &i; // error: assignment of read-only variable ‘ipc’[/code]总结起来一句话:const[b]后面[/b]的内容不能出现在赋值语句(不包括变量初始化)的[b]左边[/b]。 并非不能出现,CONST修饰在语句中同样可以被强制去除。 [b]回复 [url=http://bbs.linuxpk.com/redirect.php?goto=findpost&pid=120286&ptid=39630]3#[/url] [i]opensourcewj[/i] [/b]
只有表达式和const后面的内容“全等”时才不能出现在赋值号的左边,*ip 和 *(int *)ip 是两个完全不同的表达式。好比1+1和3-1的结果相同,但属于不同的表达式。 这篇文章是原作者在学习C 时的笔记。原文的题目是《c is on the way 4》,我对最后描述const修饰指针的那段比较敢兴趣,所以就修改了一下标题。用const来修饰指针时,我也有一些个人的体会:放到自然语言中,const的作用属于一个形容词,用于修饰后面的名词短语。因此,只要不给后面的名词短语赋值即可比如:int const * icp =
页:
[1]