Dalam C++, parameter fungsi adalah selamat terkecuali apabila diluluskan oleh nilai, kerana parameter sebenar mengekalkan nilai asalnya melalui rujukan tidak menjamin keselamatan pengecualian, dan parameter sebenar mungkin dalam keadaan tidak ditentukan. Amalan terbaik mengesyorkan menggunakan nilai lulus untuk menghantar jenis primitif, objek ringan dan parameter yang tidak menjejaskan panggilan fungsi dan menggunakan rujukan lulus untuk menghantar objek besar atau parameter yang memerlukan pengubahsuaian fungsi.
C++ fungsi pengecualian mekanisme lulus parameter selamat
Dalam C++, apabila memanggil fungsi, parameter boleh diluluskan mengikut nilai atau rujukan. Melepasi nilai bermakna mencipta salinan parameter sebenar, manakala lulus melalui rujukan menggunakan alamat parameter sebenar.
Lulus mengikut nilai
void foo(int x) { // 对 x 执行操作 }
Lulus melalui rujukan
void foo(int& x) { // 对 x 执行操作 }
Apabila fungsi melontar pengecualian, mekanisme lulus parameter mempengaruhi keadaan parameter sebenar.
Keselamatan pengecualian nilai pas
Nilai pas adalah selamat pengecualian kerana jika fungsi membuang pengecualian, parameter sebenar akan mengekalkan nilai asalnya. Contohnya:
int main() { int x = 1; try { foo(x); } catch(...) { // x 仍为 1 } }
Keselamatan pengecualian rujukan lalu
Rujukan lalu tidak menjamin keselamatan pengecualian. Jika fungsi membuang pengecualian, parameter sebenar mungkin dalam keadaan tidak ditentukan kerana fungsi itu mungkin telah menukar rujukan. Contohnya:
int main() { int x = 1; try { foo(x); } catch(...) { // x 可能不是 1 } }
Amalan Terbaik
Untuk memastikan keselamatan pengecualian, disyorkan untuk menggunakan nilai lulus apabila:
Gunakan rujukan lulus apabila:
Contoh Praktikal
Pertimbangkan fungsi yang membaca strim dan menulisnya ke fail.
Melepasi aliran mengikut nilai:
void writeToFile(std::istream& stream, std::ofstream& file) { std::string line; while (getline(stream, line)) { file << line << std::endl; } }
Melepasi aliran melalui rujukan:
void writeToFile(std::istream& stream, std::ofstream& file) { std::string line; while (getline(stream, line)) { file << line << std::endl; } stream.close(); // 按引用传递允许在函数退出时关闭流 }
Dengan menghantar aliran melalui rujukan, kami boleh memastikan aliran sentiasa ditutup apabila fungsi keluar, sekali gus memastikan aliran dalam keadaan tertutup nyatakan apabila pengecualian berlaku.
Atas ialah kandungan terperinci Fungsi C++ pengecualian mekanisme lulus parameter selamat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!