C ++:将常量对象赋给非常量对象时的结果不同

时间:2012-11-25 15:25:39

标签: c++

我有一个有两个二传手的课。一,参数是常数,一个不是。

class  Author
{
  string name;
  Book* book;
public:
  void setName(const string& name) { this->name = name; }  // no error
  void setBook(const Book* book) { this->book = book; } // error: value of const Book* cannot assign to Book*
}

我的问题是:为什么在setName方法中,我可以使参数不变而没有错误,但不能在setBook中。

谢谢:)

3 个答案:

答案 0 :(得分:4)

因为您可以在将对象*book分配给this->book之后修改它,从而绕过参数的const

(你必须明确地将它转换为指向非const对象的指针)

换句话说,

  • 声明setBook(const Book* book)表示book指向的对象不会被修改(这是对调用函数的“承诺”)。
  • 但是,字段this->book的声明方式是您可以轻松修改其指向的对象。

通过函数参数this->book中的赋值book,您稍后可以修改函数参数book最初指向的对象。

答案 1 :(得分:2)

const Book*是指向(const Book)的指针,而不是(const指向)Book。 (我相信你期待的是后者)。

您应该使用typedefed指针类型来避免此类错误。看看它是如何在windows.h中完成的:

typedef ULONG *PULONG;

这种方式没有混淆。 我的建议:在课后书写声明后立即写typedef Book *PBook;,永远不要输入" Book *"在实际代码中。

答案 2 :(得分:1)

假设您可以这样做,那么您可以编写如下代码:

// definition of Book
struct Book {
    int pages;
}

// inside Author, member function
void setBook(const Book* abook) { 
    this->book = abook;
    this->book->pages = 1; // modify the object pointed to by abook
}

// calling code that uses Author class
const Book b = {0}; // a const object
myAuthor->setBook(&b); // modifies a const object

const系统的要点是阻止你修改const对象,除非你的代码包含一个强制转换(删除const)。因此,它禁止您将类型为pointer-to-const的值赋值给类型为指针到非const的变量。