2012-02-28 3 views
5

thể trùng lặp:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?Lớp khởi tạo có hoặc không có dấu ngoặc đơn?

#include <iostream> 
using namespace std; 

class CTest 
{ 
    int x; 

    public: 
    CTest() 
    { 
     x = 3; 
     cout << "A"; 
    } 
}; 

int main() { 
    CTest t1; 
    CTest t2(); 

    return 0; 
} 

CTest t1 in "A" của khóa học.

Nhưng có vẻ như không có gì xảy ra ở t2(), nhưng mã chạy tốt.

Vì vậy, chúng tôi có sử dụng những dấu ngoặc đơn đó không có đối số không? Hoặc tại sao chúng ta có thể sử dụng nó theo cách này?

+0

Đó là [phân tích cú pháp khó chịu nhất] (http://en.wikipedia.org/wiki/Most_vexing_parse) trong C++ –

+0

@PeterWood: Cá nhân, tôi tranh chấp điều đó. Trong lịch sử, "phân tích cú pháp gây tranh cãi nhất" chỉ được đề cập đến các trường hợp sự mơ hồ xảy ra với bộ khởi tạo là giá trị được khởi tạo tạm thời, ví dụ: 'CTest t2 (CTest());' thay vì trường hợp đơn giản này. –

+0

@CharlesBailey 'liên quan đến phân tích cú pháp gây tranh cãi nhất' sẽ là một cách tốt hơn để đặt nó. Cảm ơn. –

Trả lời

14

Đây là một cú pháp của cú pháp C++. Dòng

CTest t1; 

khai báo một biến cục bộ kiểu CTest tên t1. Nó ngầm gọi các hàm tạo mặc định. Mặt khác, dòng

CTest t2(); 

không một khai báo biến, nhưng một nguyên mẫu địa phương của một hàm gọi là t2 rằng không có đối số và trả về một CTest. Lý do mà hàm tạo không được gọi là t2 là do không có đối tượng nào được tạo ở đây.

Nếu bạn muốn khai báo biến cục bộ của kiểu đối tượng và sử dụng hàm tạo mặc định, bạn nên bỏ qua dấu ngoặc đơn.

Trong C++ 11, bạn có thể lựa chọn nói

CTest t2{}; 

Mà không thực sự gọi constructor mặc định.

Hy vọng điều này sẽ hữu ích!

+8

Bạn nên lưu ý sự khác biệt giữa 'CTest t1; CTest t2 = CTest(); ' –