C ++中const成员函数中的静态成员修改

时间:2013-09-01 04:19:19

标签: c++

我正在处理链表但不能修改const函数中的当前指针的值“void Print()const”

在我想要做的功能打印“current = head”&然后增加像“current = current-> link”但不能这样做,bcz显示

“错误C3490:'current'无法修改,因为它是通过const对象访问的e:\ Cpp \ projects \ data结构ass-1 \ data结构ass-1 \ source.cpp 83 1数据结构Ass-1 “

#include<iostream>

struct node
{
    int data;
    node *link;
};    

class List
{
    node *head,*current,*last;
public:
    List();
//  List(const List&);
//  ~List();

void print() const;

};

using namespace std;

int main()
{
    List List1;
}

void List::print() const
{
     current=head;   //here is my error
     current=current->link;
}

List::List():current(head)
{

}

6 个答案:

答案 0 :(得分:4)

如果类的成员函数声明为const

void print() const;

这意味着,此函数无法修改其类的数据成员。在你的案例变量中:

node *head,*current,*last;

无法在print()的正文中进行修改。因此,您无法更改这些指针指向的地址。解决此问题的方法是在temp函数中定义局部变量print()。可以修改这样的变量,并执行与current应该做的相同的工作:

void List::print() const
{
    node *temp;     
    temp=head;   
    temp=temp->link;
}

答案 1 :(得分:3)

当您声明const成员函数时,this指针在const函数内变为const时,为对象调用它。

意味着const成员函数阻止对类的数据成员进行任何直接或直接修改。

Direct意味着你正在程序中执行的操作(直接在const成员函数中修改数据成员,这违反了它的目的)。除非您不修改数据成员,否则可以执行任何涉及数据成员的操作。此外,您可以在const成员函数中调用其他const成员函数。

而间接意味着您甚至无法调用该类的其他non-const成员函数,因为它们可能会修改数据成员。

当您只想获取/读取值时,通常会使用const个成员函数。因此,在您的情况下,您不应使用const成员函数。

此外,您可以为non-const对象调用constnon-const成员函数。

答案 2 :(得分:2)

您将print()函数声明为const。这意味着该函数不会修改类的成员变量,这是您在函数定义中首先要做的事情。

答案 3 :(得分:1)

node *head,*current,*last;修改为mutable node *head,*current,*last;

答案 4 :(得分:0)

错误告诉您到底发生了什么 - 当您说List::print() const时,您承诺不会修改列表中的任何成员。但接着你去尝试修改current

如果没有看到其余代码,很难说,但current可能不应该是成员变量,而应该是List::print()的本地变量。或许List::print()不应该是常量。你也可以让current变得可变,但这几乎总是不好的做法。

答案 5 :(得分:0)

current声明为方法打印的本地变量。如果您将current用作其他目的的成员变量,则局部变量将对其进行遮蔽。如果您没有使用current作为成员变量,那么您可以删除它。