Fungsi C++ pengecualian mekanisme lulus parameter selamat

王林
Lepaskan: 2024-04-19 11:06:02
asal
1185 orang telah melayarinya

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++ 函数异常安全参数传递机制

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 执行操作
}
Salin selepas log masuk

Lulus melalui rujukan

void foo(int& x) {
  // 对 x 执行操作
}
Salin selepas log masuk

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
  }
}
Salin selepas log masuk

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
  }
}
Salin selepas log masuk

Amalan Terbaik

Untuk memastikan keselamatan pengecualian, disyorkan untuk menggunakan nilai lulus apabila:

  • Parameter adalah jenis primitif (cth., int, char, double).
  • Parameter ialah objek ringan (cth., struktur kecil).
  • Perubahan kepada parameter sebenar seharusnya tidak menjejaskan fungsi panggilan.

Gunakan rujukan lulus apabila:

  • Parameter ialah objek besar (cth., bekas, struktur kompleks).
  • Perubahan kepada parameter sebenar perlu ditunjukkan dalam fungsi panggilan.

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;
  }
}
Salin selepas log masuk

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(); // 按引用传递允许在函数退出时关闭流
}
Salin selepas log masuk

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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan