2012-04-22 23 views
8

Thao tác trên con trỏ "này" có gọi là hàm tạo không?* điều này làm cho một cuộc gọi đến nhà xây dựng?

Tôi có một nhà xây dựng quy định như sau

Cents(int cents) 
    { 
      cout<<"in cents constructor\n"; 
      m_cents = cents; 
    } 

    friend Cents operator + (const Cents &c1, const Cents &c2) 
    {   
      return Cents(c1.m_cents + c2.m_cents); 
    } 

    Cents operator ++ (int) 
    { 
      cout<<"In c++ function\n"; 
      Cents c(m_cents); 
      *this = *this + 1 ; 
      return c; 
    } 

trong hàm main Tôi có sth như ...

Cents c; 
    cout<<"Before post incrementing\n"; 
    c++; //This part is calling the constructor thrice 

Bây giờ Nếu tôi đang làm một số hoạt động như *this = *this + 1. Nó gọi hàm khởi tạo này hai lần.

gì chính xác là xảy ra ở đây. *this có tạo đối tượng tạm thời và gán giá trị cho đối tượng gốc không?

+4

Vui lòng hiển thị thêm mã cho chúng tôi. Bạn có bản sao hàm tạo và toán tử gán được xác định? –

+0

@ RafałRawicki .... Không, tôi không có bất kỳ nhà xây dựng bản sao hoặc toán tử gán nào được xác định. –

+0

Bạn có thể đăng ví dụ hoàn chỉnh không? Xem http://sscce.org Tôi nghĩ, các nhà xây dựng Cents nên được gọi một lần trong biểu thức này, không phải hai lần. –

Trả lời

11

Không, dereferencing con trỏ không tạo đối tượng mới.

Hovever, nếu bạn có operator+ định nghĩa chỉ dành cho trường hợp của lớp học của bạn, sẽ có một trường hợp mới xây dựng từ1, bởi vì các nhà xây dựng Cents(int cents) không được đánh dấu như rõ ràng.

+0

bạn có thể vui lòng xây dựng nó một chút :) – Invictus

+0

@Ritesh Xem: http://stackoverflow.com/a/121163/13767 :) –

3

Bạn đã một toàn bộ rất nhiều contsructions xảy ra ở đây!

Cents c; 

Đường này gọi Cents::Cents(), được tổng hợp bởi trình biên dịch và không thể làm những gì bạn muốn.

Sau đó, bạn gọi:

Cents Cents::operator++(int) 

nào trả về một đối tượng và rõ ràng làm cho một cuộc gọi đến Cents::Cents(int).

Sau đó, bạn làm nhiệm vụ tò mò của bạn, mà làm cho các cuộc gọi thứ hai để Cents::Cents(int) cho đối số thứ hai.

Khi bạn gọi Cents operator+(const Cents&, const Cents&) bạn xây dựng một cách rõ ràng mới một Cents::Cents(int) và trả về một bản sao của nó ...

Sau đó, bạn gọi tổng hợp Cents& Cents::operator=(const Cents&), mà lại có thể không làm những gì bạn muốn nó.

Một nhà điều hành sau increment điển hình sẽ trông như thế này:

Cents& operator++(int) 
{ 
    Cents rv = *this; 

    ++m_cents; 

    return rv; 
} 

Thông báo như thế nào nó trả về giá trị của lớp như trước thặng dư bằng cách gọi constructor sao chép (chứ không phải là ghi đè) và cũng làm thế nào nó tăng các thành viên của lớp riêng lẻ.

Các vấn đề liên quan