Trên thực tế, có hai lý do này hình dung có thể chậm hơn.
Trước tiên, không có cách nào để tạo NodeId chưa được khởi tạo. Thông thường, đó là điều tốt. Nhưng hãy tưởng tượng bạn có mã như sau:
NodeId nodeid;
foo.initializeNodeId(&nodeid);
Bạn sẽ thực hiện một nhiệm vụ bổ sung không thực sự cần thiết.
Bạn có thể khắc phục điều đó bằng cách thêm một hàm tạo đặc biệt. Nó có thể tốt hơn nhiều để tạo ra một Foo :: createNodeId() vì vậy bạn không cần Foo :: initializeNodeId (& NodeId), nhưng nếu bạn không kiểm soát định nghĩa của Foo, điều đó có thể không thực hiện được.
Thứ hai, một NodeId không phải là biểu thức hằng số biên dịch. Như dasblinkenlight cho thấy, điều này có nhiều khả năng gây ra vấn đề với mã không hợp pháp hơn là gây ra các vấn đề về hiệu suất, nhưng cả hai đều có thể. (Tại sao? Bởi vì bạn có thể buộc trình biên dịch chèn mã để làm một số phép tính trong thời gian chạy mà có thể đã được thực hiện tại thời gian biên dịch, nếu bạn đang sử dụng một int.Không phải là điều này có thể là một vấn đề cho một lớp được gọi là NodeId…)
May mắn thay, nếu bạn đang sử dụng C++ 11, bạn có thể sửa lỗi đó bằng constexpr. Và nếu bạn muốn mã của bạn cũng hợp pháp C++ 03, bạn có thể xử lý nó bằng macro.
Ngoài ra, như được chỉ ra bởi dasblinkenlight, bạn đang thiếu const theo hai phương pháp.
Cuối cùng, không có lý do gì để viết "nội tuyến" trên các phương thức được xác định bên trong định nghĩa lớp; chúng vốn đã nội tuyến.
Đưa nó tất cả cùng nhau:
#if __cplusplus > 201000L
#define CONSTEXPR_ constexpr
#else
#define CONSTEXPR_
#endif
class NodeId
{
int value;
public:
struct Uninitialized {};
CONSTEXPR_ NodeId() : value(-1) {}
CONSTEXPR_ NodeId(Uninitialized) {}
CONSTEXPR_ NodeId(int value) : value(value) {}
CONSTEXPR_ operator int() const {return value;}
CONSTEXPR_ bool isValid() const {return value != -1;}
//...
};
Bây giờ bạn có thể làm điều này, để tránh những chi phí thêm một -1 chuyển nhượng.
NodeId nodeId(NodeId::Uninitialized());
foo.initializeNodeId(&nodeid);
Và điều này, sử dụng một cách hợp pháp một nodeID như một tổ chức phi kiểu mẫu tham số:
myClassTemplate<NodeId(3)> c;
Hoặc, điều này, chắc chắn trình biên dịch có thể hợp pháp chỉ khởi tạo x 4:
int x = 3;
x += NodeId(1);
Nếu bạn sử dụng một trình biên dịch mới, thì nó phải giống như sử dụng int. – mfontanini
@mfontanini Vậy tại sao bạn lại downvote câu hỏi? Đây là câu trả lời cho câu hỏi, bạn nên đăng nó như vậy. – leemes
@leemes tại sao bạn lại cho rằng đó là tôi? – mfontanini