template <class T>class Node{private:Node<T> *next; //指向后继结点的指针public:T data; //数据域Node (const T& item, Node<T>* ptrnext = NULL); // 构造函数void InsertAfter(Node<T> *p); // 在本结点之后插入一个同类结点p Node<T> *DeleteAfter(void); // 删除本结点的后继结点,并返回其地址Node<T> *NextNode(void) const; // 获取后继结点的地址};我只知道只有常成员函数才有资格操作常量或常对象,但是上述代码中没有定义常量啊,那Node<T> *NextNode(void) const;中为什么定义成const呢??还有Node (const T& item, Node<T>* ptrnext = NULL);中为什么要加上一个const呢???请高手指点迷津!!!!!!!
2 回答
慕雪6442864
TA贡献1812条经验 获得超5个赞
Node (const T& item, Node<T>* ptrnext = NULL);
中的 const T& item:
你也许会疑惑为什么这里会用const
首先 看看后面传的 T& item 是传的参数的一个引用
意味着在函数里改变item的值会影响到实参的值
而这个是程序不希望看到的 所以加上const的修饰符 以防止参数的值在函数中被修改
这里你也许又会有疑问 那为什么不直接传 T item
这样在函数里改变item的值也不会影响实际参数的值
原因是这样的
如果用 T item传值 需要先把实参里的值 拷贝到另一个内存单元中
在函数中操作的实际上是这个新的内存单元中的值
所以不会改变原来参数的值 这就是所谓的值传递
在这个过程中多了两个开销 一个是时间开销 就是把原值拷贝到新地址的时间 另一个是空间开销 就是新申请的一片区域
所以用 const T& 传值可以节省一些时间和空间的开销~
汪汪一只猫
TA贡献1898条经验 获得超8个赞
void fun(const int a);//变量a为常量,不能被改变
const int fun(void);
int a = fun();
//返回值为常量,不能被改变,即a不能被改变
class A
{
...
void SetA(int a) const;
}
//常量函数,成员函数SetA,不能改变类A中成员变量的值
添加回答
举报
0/150
提交
取消