2009-10-19 63 views
5

OK Tôi không phải là một lập trình viên C++ rất có kinh nghiệm, nhưng tôi đã tự hỏi ý nghĩa của dấu gạch dưới trong các đối số của constructor sau là gì?Ý nghĩa của dấu gạch dưới hàng đầu trong hàm dựng C++ là gì?

class floatCoords 
{ 
public: 
    floatCoords(float _x, float _y, float _width, float _height) 
    : x(_x), y(_y), width(_width), height(_height) 
    { 

    } 
    float x, y, width, height; 
    ... 

Trả lời

8

Đó chỉ là quy ước đặt tên thuận tiện, nó không có nghĩa gì đối với ngôn ngữ. Chỉ cần chắc chắn rằng bạn không tuân thủ nó bằng một chữ cái viết hoa: What does double underscore (__const) mean in C?

+2

Cũng thấy: http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier/228797#228797 –

+0

@Martin: Cảm ơn, tôi thích liên kết tốt hơn. –

+1

Tôi tránh các dấu gạch ngang hàng đầu hoàn toàn chỉ vì vậy tôi không phải giải thích/hãy nhớ rằng "không tuân theo một chữ cái viết hoa". –

1

Chúng chỉ là tên cho các tham số được truyền. Chúng xảy ra khớp với biến thành viên và được sử dụng cho trình khởi tạo.

Không có ý nghĩa đặc biệt - nó chỉ là một quy ước mà một số người có thể sử dụng.

9

Không có gì đặc biệt. Ông chỉ đặt tên nó như thế để phân biệt giữa các biến thành viên và tên tham số.

Dấu gạch dưới là một ký tự hợp lệ trong số nhận dạng C++.

+1

Ngoài ra, thông thường các biến thành viên có dấu gạch dưới res theo quy ước và các đối số hàm tạo không. Đó là tất cả thực sự lên đến các quy ước mã hóa địa phương mặc dù. Một số cửa hàng yêu cầu "m_" trước mặt các thành viên. Tránh xa đôi gạch dưới mặc dù (dành riêng cho việc sử dụng trình biên dịch). xem: http://stackoverflow.com/questions/1228161/why-use-prefixes-on-member-variables-in-c-classes – bluehavana

+3

Tôi đã thấy đủ mã để nói rằng không có gì trong tên của các thành viên riêng tư, ít dấu gạch dưới hơn, là thông thường. – coppro

+2

Cũng lưu ý rằng sự phân biệt này là không cần thiết trong một ctor-initializer - tra cứu tên cho các thành viên chỉ tìm thấy các thành viên, và tra cứu tên bên trong initializer sẽ tìm thấy tên tham số đầu tiên. – coppro

0

Chúng không có ý nghĩa cú pháp. Tuy nhiên, nếu bạn có một loạt các trường (ví dụ: x, y, widthheight), đó là quy ước chung để đặt tên cho tham số hàm khởi tạo chúng bằng tên trường cộng với dấu gạch dưới hàng đầu.

0

Mục đích của các dấu gạch dưới là phân biệt biến tham số float _x và biến thành viên float x. Cú pháp, không có ý nghĩa đặc biệt nào được thêm vào do dấu gạch dưới. Cá nhân tôi thích tiền tố tất cả các tham số với a_ và tiền tố tất cả các biến thành viên với m_ khi tôi phải mã C++.

Vì vậy, khi tôi đi vào một tình huống mà tôi phải trộn và kết hợp các biến cục bộ, thành viên và tham số, tôi biết tôi đang xử lý những biến nào.

int y = a_x * 2; 
m_x = y + 3; 
8

Rất có thể, tác giả của mã đã cố tránh xung đột giữa tên thành viên dữ liệu và tên tham số hàm dựng trong danh sách khởi tạo. Rất có thể, tác giả đã không nhận thức được thực tế là các quy tắc tra cứu C++ đảm bảo rằng cuộc xung đột sẽ không xảy ra. I E. mã sau cũng sẽ tạo ra kết quả mong đợi

class floatCoords { 
    public: 
     floatCoords(float x, float y, float width, float height) 
       : x(x), y(y), width(width), height(height) 
     { 
     } 
     float x, y, width, height; 
     ... 

mặc dù nó có thể gây nhầm lẫn cho người đọc chưa chuẩn bị.

Tất nhiên, bên trong phần thân của hàm tạo, tên tham số sẽ ẩn tên thành viên, do đó việc sử dụng this->... hoặc tên đủ điều kiện để truy cập vào các thành viên dữ liệu. Rất có thể là tác giả của mã đã cố gắng để tránh điều đó là tốt.

+0

Thú vị, không biết miếng ngon này. Tuy nhiên, trong tâm trí của tôi nó vẫn sẽ là tốt hơn để sử dụng tên tham số mà không phù hợp với tên biến thành viên. Trong trường hợp này, bạn có thể sử dụng x và y làm tham số trong ctor, nhưng bạn đã viết các phương thức setX và setY, bạn sẽ phải sử dụng các tên tham số khác nhau. Tôi thích giữ tên tham số của mình nhất quán trong suốt lớp học. – ThisSuitIsBlackNot

+0

@ ThisSuitIsBlackNot: Không nhất thiết. Cú pháp 'this-> member' này cho phép bạn thực hiện các phương thức' setX' và 'setY' ngay cả khi các tên tham số ẩn các tên thành viên. Một số tiêu chuẩn mã hóa thực sự yêu cầu các thành viên lớp luôn được truy cập thông qua cú pháp 'this-> member' (có giá trị nhất định trong đó, tôi phải thừa nhận). – AnT

+0

@AndreyT: Bạn thực hiện một điểm tốt. Nếu được sử dụng nhất quán, cú pháp thành viên này rất rõ ràng (tôi đã thấy định dạng này trong nhiều lớp Java). Tuy nhiên, điều gì sẽ xảy ra khi bạn quên phần "này->"? Tôi không chắc hành vi là gì, nhưng tôi tưởng tượng điều này xảy ra thường xuyên trên các dự án lớn. Ngay cả khi không có gì đáng sợ xảy ra, sự mâu thuẫn trong mã sẽ làm phiền tôi (tôi đang chọn một nit ở đây). – ThisSuitIsBlackNot

0

vì nếu bạn đặt tên cho phao x, phao y vv bạn không thể truy cập vào các trường thực tế của lớp vì chúng có cùng tên.

nó không có gì để làm với ngôn ngữ, nó chỉ là một quy ước bởi các lập trình viên thực tế (để làm cho đoạn code rõ ràng hơn, tôi nghĩ rằng)

2

Đây chỉ là ước của đặt tên biến mà những người khác nhau/các tổ chức giả. Điều này có vẻ không cần thiết ngay từ cái nhìn đầu tiên nhưng thực sự rất hữu ích khi đọc và viết mã, đặc biệt khi bạn có các tham số và biến thành viên có cùng tên. Ví dụ.bạn thường có thể có ba trường hợp:

class A { 
    void foo(int age_) { //parameter 
    int age = 18; //local scope 
    if (age_ > age) cout << legal << endl; 
    } 
    int _age; //member 
}; 

Trong ví dụ trên:

  • _variable - có nghĩa đây là một thành viên lớp biến
  • variable_ - có nghĩa đây là một tham số để một hàm
  • Biến số
  • - có nghĩa đây chỉ là biến thông thường cục bộ cho phạm vi chức năng
+0

và _Variable tresspasses vào không gian tên triển khai thực hiện. –

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