Một câu hỏi đơn giản mà tôi không thể tìm thấy câu trả lời ở đây.
Điều tôi hiểu là trong khi chuyển một đối số cho một hàm trong cuộc gọi, ví dụ:
void myFunction[type myVariable]
{
}
void main[]
{
myFunction[myVariable];
}
Đối với các kiểu dữ liệu đơn giản như int
, float
, v.v ... Hàm được gọi theo giá trị.
Nhưng nếu myVariable
là một mảng, chỉ có địa chỉ bắt đầu được truyền [mặc dù chức năng của chúng tôi là một cuộc gọi theo hàm giá trị].
Nếu myVariable
là một đối tượng, cũng chỉ có địa chỉ của đối tượng được truyền thay vì tạo một bản sao và truyền nó.
Vì vậy, trở lại câu hỏi. C ++ có chuyển một đối tượng bằng tham chiếu hoặc giá trị không?
hỏi ngày 19 tháng 1 năm 2014 lúc 10:10Jan 19, 2014 at 10:10
user3041058user3041058user3041058
1.4502 huy hiệu vàng11 Huy hiệu bạc16 Huy hiệu đồng2 gold badges11 silver badges16 bronze badges
9
Đối số được truyền theo giá trị, trừ khi chữ ký hàm chỉ định khác:
- Trong
void foo[type arg]
,arg
được truyền bởi giá trị bất kểtype
là loại đơn giản, loại con trỏ hay loại lớp, - Trong
void foo[type& arg]
,arg
được thông qua bởi tham chiếu.
Trong trường hợp các mảng, giá trị được truyền là một con trỏ tới phần tử đầu tiên của mảng. Nếu bạn biết kích thước của mảng tại thời gian biên dịch, bạn cũng có thể vượt qua một mảng bằng cách tham khảo: int
0.
Đã trả lời ngày 19 tháng 1 năm 2014 lúc 10:14Jan 19, 2014 at 10:14
3
C ++ luôn cung cấp cho bạn sự lựa chọn: Tất cả các loại int
1 [ngoại trừ các mảng, xem bên dưới] có thể được truyền theo giá trị bằng cách thực hiện loại tham số int
1 và được truyền bằng cách tham chiếu bằng cách tạo loại tham số int
3, tham chiếu-________ 11.All types int
1 [except arrays, see below] can be passed by value by
making the parameter type int
1, and passed by reference by making the parameter type int
3, reference-to-int
1.
Khi loại tham số không được chú thích rõ ràng là tham chiếu [int
5], nó luôn được truyền bởi giá trị bất kể loại cụ thể. Đối với các loại do người dùng định nghĩa cũng vậy [đó là những gì trình xây dựng bản sao dành cho]. Ngoài ra, đối với con trỏ, mặc dù sao chép một con trỏ không sao chép những gì chỉ ra.
Mảng phức tạp hơn một chút. Các mảng không thể được truyền theo giá trị, các loại tham số như int
6 thực sự chỉ là cú pháp khác nhau cho int
7. Đó không phải là hành động chuyển đến một hàm tạo ra một con trỏ từ một mảng, hầu như mọi hoạt động có thể [không bao gồm một vài hoạt động như int
8] làm điều đó. Người ta có thể vượt qua một tham chiếu đến một mảng, nhưng điều này được chú thích rõ ràng dưới dạng tham chiếu: int
9 [lưu ý ampersand].
Đã trả lời ngày 19 tháng 1 năm 2014 lúc 10:18Jan 19, 2014 at 10:18
3
C ++ làm cho cả vượt qua giá trị và vượt qua các mô hình tham chiếu có thể.
Bạn có thể tìm thấy hai cách sử dụng ví dụ dưới đây.
//www.learncpp.com/cpp-tutorial/72-passing-arguments-by-value/
//www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/
Các mảng là các cấu trúc đặc biệt, khi bạn chuyển một mảng làm tham số, một con trỏ đến địa chỉ của phần tử đầu tiên được truyền dưới dạng giá trị với loại phần tử trong mảng.
Khi bạn vượt qua một con trỏ dưới dạng tham số, bạn thực sự sẽ tự thực hiện mô hình tham chiếu, như trong C. bởi vì khi bạn sửa đổi dữ liệu trong địa chỉ được chỉ định, bạn sẽ sửa đổi chính xác đối tượng trong hàm người gọi.
Đã trả lời ngày 19 tháng 1 năm 2014 lúc 10:22Jan 19, 2014 at 10:22
McVKrmcvkrmcvkr
2.7096 Huy hiệu vàng36 Huy hiệu bạc62 Huy hiệu Đồng6 gold badges36 silver badges62 bronze badges
Trong C ++, các loại được khai báo là một lớp, struct hoặc liên minh được coi là "loại lớp". Chúng được truyền theo giá trị hoặc bạn có thể nói một bản sao sử dụng trình xây dựng bản sao được truyền cho các chức năng. Điều này khá rõ ràng khi chúng tôi thực hiện các cây nhị phân trong đó bạn hầu như luôn có một loại param nút * trong hàm đệ quy tác dụng trên cây nhị phân. Điều này là để tạo điều kiện sửa đổi nút đó. Nếu nút được truyền như là [tức là không phải là loại con trỏ], các sửa đổi cho các nút sẽ được gửi đến bản sao cục bộ. Ngay cả trong trường hợp của các vectơ, trong khi chuyển một bản sao của các vectơ được truyền cho các hàm, để tránh chúng tôi sử dụng tham chiếu &.
Đã trả lời ngày 3 tháng 8 năm 2019 lúc 12:57Aug 3, 2019 at 12:57
C ++ chuyển các đối số không phải là con trỏ [int*] hoặc tài liệu tham khảo [int &] theo giá trị. Bạn không thể sửa đổi VAR của khối gọi trong hàm được gọi. Mảng là gợi ý.
Đã trả lời ngày 19 tháng 1 năm 2014 lúc 10:17Jan 19, 2014 at 10:17
Scraatzscraatzscraatz
4092 Huy hiệu bạc7 Huy hiệu đồng2 silver badges7 bronze badges
10