我有一个有两个二传手的课。一,参数是常数,一个不是。
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
中。
谢谢:)
答案 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的变量。