Rumah >pembangunan bahagian belakang >C++ >Fungsi C++ pengecualian mekanisme lulus parameter selamat

Fungsi C++ pengecualian mekanisme lulus parameter selamat

王林
王林asal
2024-04-19 11:06:021196semak imbas

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 执行操作
}

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:

  • 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;
  }
}

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!

Kenyataan:
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