Dalam pengendalian pengecualian, kaedah lulus parameter fungsi C++ akan mempengaruhi tingkah laku abnormal: lulus nilai: pembolehubah setempat dan parameter lulus nilai akan dimusnahkan tanpa menjejaskan data asal. Melewati rujukan: Pengecualian akan menjejaskan data asal, yang membawa kepada tingkah laku yang tidak ditentukan. Pemindahan penunjuk: Data asal tidak akan terjejas, tetapi data yang ditunjuk oleh penunjuk mungkin diubah suai.
Terdapat tiga cara untuk menghantar parameter fungsi dalam C++: hantaran nilai, hantaran rujukan dan hantaran penunjuk. Ketiga-tiga kaedah ini menunjukkan tingkah laku yang berbeza dalam pengendalian pengecualian.
Lulus nilai ialah kaedah hantaran parameter lalai. Parameter fungsi dianggap sebagai pembolehubah tempatan dalam fungsi. Apabila pengecualian berlaku dalam fungsi, ruang memori yang diperuntukkan kepada parameter pada fungsi panggilan akan dimusnahkan. Dalam kes ini, pengecualian tidak menjejaskan data asal fungsi panggilan.
Kes praktikal:
void func(int x) { // ... throw std::exception(); // ... } int main() { int y = 10; try { func(y); } catch (std::exception& e) { std::cout << e.what() << std::endl; } std::cout << y << std::endl; // 输出:10 }
Lulus melalui rujukan menghantar rujukan parameter pada fungsi panggilan ke bahagian dalam fungsi. Apabila pengecualian berlaku dalam fungsi, pengecualian masih akan menjejaskan data asal dalam fungsi panggilan.
Kes praktikal:
void func(int& x) { // ... throw std::exception(); // ... } int main() { int y = 10; try { func(y); } catch (std::exception& e) { std::cout << e.what() << std::endl; } std::cout << y << std::endl; // 输出:未定义行为 }
Hantaran penunjuk melepasi penunjuk parameter pada fungsi panggilan ke bahagian dalam fungsi. Apabila pengecualian berlaku dalam fungsi, pengecualian tidak akan menjejaskan data asal dalam fungsi panggilan. Tetapi data yang ditunjukkan oleh penunjuk mungkin diubah suai.
Kes praktikal:
void func(int* x) { // ... *x = 20; // 修改指针所指向的数据 throw std::exception(); // ... } int main() { int y = 10; try { func(&y); } catch (std::exception& e) { std::cout << e.what() << std::endl; } std::cout << y << std::endl; // 输出:20 }
Dalam pengendalian pengecualian, apabila pengecualian berlaku, ruang memori yang diduduki terutamanya oleh pembolehubah tempatan fungsi dan parameter yang diluluskan oleh nilai akan dimusnahkan. Parameter yang diluluskan melalui rujukan atau penuding tidak akan dimusnahkan dan data asal yang sepadan masih wujud. Perlu diingatkan bahawa untuk pemindahan penunjuk, data yang ditunjuk oleh penunjuk boleh diubah suai.
Atas ialah kandungan terperinci Penjelasan terperinci tentang parameter fungsi C++: kekhususan parameter lulus dalam pengendalian pengecualian. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!