0

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

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.

谢谢 :)

4

3 回答 3

4

因为您可以在将对象*book指向 分配给 之后对其进行修改this->book,从而规避const了论点的本质。

(您必须将其显式转换为指向非常量对象的指针)

换句话说,

  • 声明setBook(const Book* book)意味着指向的对象book不会被修改(这是对调用函数的“承诺”)。
  • 然而,该字段this->book以一种您可以轻松修改它所指向的对象的方式声明。

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

于 2012-11-25T15:27:21.413 回答
2

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

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

typedef ULONG *PULONG;

这样就没有混乱了。我的建议:typedef Book *PBook;在类 Book 声明之后立即编写,并且永远不要在实际代码中输入“Book*”。

于 2012-11-25T15:33:00.667 回答
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)。因此,它禁止您将指针到常量类型的值分配给类型为非常量指针的变量。

于 2012-11-25T16:08:31.867 回答