为了账号安全,请及时绑定邮箱和手机立即绑定

以下代码内容求助,具体是关于const,麻烦知道的帮忙看一下~

以下代码内容求助,具体是关于const,麻烦知道的帮忙看一下~

冉冉说 2021-11-25 21:15:55
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& 传值可以节省一些时间和空间的开销~

查看完整回答
反对 回复 2021-11-29
?
汪汪一只猫

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中成员变量的值



查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 316 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信