2012-11-25 43 views
0

我有两个setter的类。其中一个参数是恒定的,另一个不是。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进行参数不变,并没有错误,但不是。

谢谢:)

+2

因为它是一个指针 – hinafu

回答

4

,因为你将能够修改对象*book点,将其分配给this->book后,从而避开了const内斯的说法。

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

换句话说,

  • 声明setBook(const Book* book)意味着对象由book指出,不会被修改(这是对调用函数的'承诺')。
  • 然而,字段this->book的声明方式可让您轻松修改指向的对象。

通过从函数参数book分配this->book你就可以稍后修改对象最初指向函数参数book

2

const Book*是一个指向(const Book)的指针,而不是指向Book的指针。 (我相信你预计晚些时候)。

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

typedef ULONG *PULONG; 

这样就没有混淆。 我的建议:在课后写下typedef Book *PBook;书本声明,并且在实际代码中永远不会输入“Book *”。

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的值赋值给类型为指向非const的变量。