thể trùng lặp:
Why is it an error to use an empty set of brackets to call a constructor with no arguments?Tại sao hàm tạo không được gọi khi() được sử dụng để khai báo một đối tượng?
$ cat cons.cpp
#include <iostream>
class Matrix {
private:
int m_count;
public:
Matrix() {
m_count = 1;
std::cout << "yahoo!" << std::endl;
}
};
int main() {
std::cout << "before" << std::endl;
Matrix m1(); // <----
std::cout << "after" << std::endl;
}
$ g++ cons.cpp
$ ./a.out
before
after
$
không cú pháp Matrix m1();
làm gì?
Tôi tin rằng nó giống như Matrix m1;
. Rõ ràng tôi sai.
@Lazer: để thuyết phục chính mình, cố gắng sử dụng m1 (ví dụ truy cập m1.m_count) ... – Francesco
Trong C++ 11 bạn có thể sử dụng niềng răng đối với tất cả các hàm gọi hàm dựng, điều này tránh được sự phân tích cú pháp khó hiểu nhất của C++, tức là ma trận m1 {}; – mark
Đây không phải là "phân tích cú pháp khó chịu nhất", phân tích cú pháp gây tranh cãi nhất là khi bạn cố gắng khai báo và đối tượng và chuyển một giá trị được khởi tạo tạm thời cho một hoặc nhiều tham số hàm tạo. Ví dụ. 'A b (A());'. 'Matrix m1();' chỉ là một khai báo hàm thông thường. –