cari
Rumahpembangunan bahagian belakangC++Konflik antara fungsi rakan C++ dan kawalan akses

Konflik antara fungsi rakan C++ dan kawalan akses

Apr 16, 2024 pm 06:09 PM
c++kawalan capaianfungsi rakan

Dalam C++, fungsi rakan dan kawalan akses mungkin bercanggah. Untuk mengakses ahli persendirian, anda boleh mengisytiharkan ahli sebagai dilindungi atau menggunakan fungsi proksi. Sebagai contoh, kelas Pelajar mempunyai nama dan skor ahli peribadi, dan fungsi rakan printName dan printScore boleh mencetak ahli ini masing-masing.

C++ 友元函数与访问控制的冲突

C++ Fungsi Rakan dan Konflik Kawalan Akses

Dalam C++, fungsi rakan ialah fungsi bukan ahli yang boleh mengakses ahli peribadi kelas. Walau bagaimanapun, apabila ia berkaitan dengan kawalan akses, fungsi rakan mungkin menghadapi konflik dengan kawalan akses ahli kelas.

Kawalan Akses

C++ menyediakan tiga tahap kawalan akses:

  • awam: Boleh diakses dari mana-mana sahaja dalam kelas.
  • dilindungi: Hanya boleh diakses dari kelas dan kelas terbitannya.
  • peribadi: Hanya boleh diakses dari dalam kelas.

Fungsi rakan

Fungsi rakan diisytiharkan melalui kata kunci rakan. Fungsi rakan mempunyai akses kepada semua ahli kelas, tanpa mengira tahap kawalan akses. Walau bagaimanapun, fungsi rakan tidak menjadi sebahagian daripada kelas. friend 关键字声明的。友元函数可以访问类的所有成员,无论访问控制级别如何。但是,友元函数不会成为类的一部分。

访问控制冲突

当友元函数试图访问私有成员时,就会发生访问控制冲突。例如:

class MyClass {
private:
    int x;

friend void printX(MyClass& obj) {
    std::cout << obj.x << std::endl;
}
};

在这个例子中,printX 函数是类的友元,但它试图访问私有成员 x。这会导致编译器错误。

解决冲突

要解决访问控制冲突,可以使用以下方法:

1. 使用保护成员

将私有成员声明为受保护成员。这允许派生类和友元函数访问该成员。

class MyClass {
protected:
    int x;

friend void printX(MyClass& obj) {
    std::cout << obj.x << std::endl;
}
};

2. 使用代理函数

创建另一个类成员函数作为私有成员的代理。这个代理函数可以公开访问,供友元函数使用。

class MyClass {
private:
    int x;

public:
    int getX() const { return x; }

friend void printX(MyClass& obj) {
    std::cout << obj.getX() << std::endl;
}
};

实战案例

在以下实际案例中,我们有一个 Student 类,它有 namescore两个私有成员。我们想要创建两个友元函数 printName()printScore()

Pelanggaran Kawalan Akses

Pelanggaran kawalan akses berlaku apabila fungsi rakan cuba mengakses ahli persendirian. Contohnya: 🎜
class Student {
private:
    std::string name;
    int score;

friend void printName(Student& obj) {
    std::cout << "Name: " << obj.name << std::endl;
}

friend void printScore(Student& obj) {
    std::cout << "Score: " << obj.score << std::endl;
}
};
🎜Dalam contoh ini, fungsi printX ialah rakan kelas, tetapi ia cuba mengakses ahli peribadi x. Ini boleh menyebabkan ralat pengkompil. 🎜🎜🎜Menyelesaikan konflik🎜🎜🎜Untuk menyelesaikan konflik kawalan akses, anda boleh menggunakan kaedah berikut: 🎜🎜🎜1. Gunakan ahli yang dilindungi 🎜🎜🎜 untuk mengisytiharkan ahli persendirian sebagai ahli yang dilindungi. Ini membenarkan kelas terbitan dan fungsi rakan untuk mengakses ahli. 🎜
int main() {
    Student student;
    student.name = "John Doe";
    student.score = 95;

    printName(student);
    printScore(student);

    return 0;
}
🎜🎜2. Gunakan fungsi proksi🎜🎜🎜 untuk mencipta satu lagi fungsi ahli kelas sebagai proksi untuk ahli persendirian. Fungsi proksi ini boleh diakses secara umum untuk digunakan oleh fungsi rakan. 🎜
Name: John Doe
Score: 95
🎜🎜Kes praktikal🎜🎜🎜Dalam kes sebenar berikut, kami mempunyai kelas Pelajar, yang mempunyai dua peribadi: nama dan skor ahli. Kami ingin mencipta dua fungsi rakan printName() dan printScore() untuk mencetak ahli peribadi ini masing-masing. 🎜rrreee🎜Menggunakan fungsi rakan kita boleh mencetak nama dan gred pelajar dengan mudah walaupun mereka adalah ahli persendirian. 🎜rrreee🎜Output: 🎜rrreee

Atas ialah kandungan terperinci Konflik antara fungsi rakan C++ dan kawalan akses. 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
C# vs Prestasi C: Penandaarasan dan PertimbanganC# vs Prestasi C: Penandaarasan dan PertimbanganApr 25, 2025 am 12:25 AM

Perbezaan prestasi antara C# dan C terutamanya dicerminkan dalam kelajuan pelaksanaan dan pengurusan sumber: 1) C biasanya melakukan lebih baik dalam pengiraan berangka dan operasi rentetan kerana ia lebih dekat dengan perkakasan dan tidak mempunyai overhead tambahan seperti pengumpulan sampah; 2) C# lebih ringkas dalam pengaturcaraan berbilang thread, tetapi prestasinya sedikit lebih rendah daripada C; 3) Bahasa yang harus dipilih harus ditentukan berdasarkan keperluan projek dan tumpukan teknologi pasukan.

C: Adakah ia mati atau hanya berkembang?C: Adakah ia mati atau hanya berkembang?Apr 24, 2025 am 12:13 AM

C isnotdying; it'sevolving.1) c suplemenvantduetoitsverversatilityandeficiencyinperformance-criticalapplications.2) thelanguageiscontinuouslyupdated, withc 20introducingfeatureslikemodulesandcoroutinestoMproveusability.3)

C Di Dunia Moden: Aplikasi dan IndustriC Di Dunia Moden: Aplikasi dan IndustriApr 23, 2025 am 12:10 AM

C digunakan secara meluas dan penting di dunia moden. 1) Dalam pembangunan permainan, C digunakan secara meluas untuk prestasi tinggi dan polimorfisme, seperti Unrealengine dan Perpaduan. 2) Dalam sistem perdagangan kewangan, latensi rendah C dan throughput yang tinggi menjadikannya pilihan pertama, sesuai untuk perdagangan frekuensi tinggi dan analisis data masa nyata.

C XML Perpustakaan: Membandingkan dan Berbeza PilihanC XML Perpustakaan: Membandingkan dan Berbeza PilihanApr 22, 2025 am 12:05 AM

Terdapat empat perpustakaan XML yang biasa digunakan di C: TinyXML-2, PugixML, Xerces-C, dan RapidXML. 1.TinyXML-2 sesuai untuk persekitaran dengan sumber terhad, fungsi ringan tetapi terhad. 2. PugixML cepat dan menyokong pertanyaan XPath, sesuai untuk struktur XML yang kompleks. 3.xerces-C berkuasa, menyokong resolusi DOM dan SAX, dan sesuai untuk pemprosesan kompleks. 4. RapidXML memberi tumpuan kepada prestasi dan parses sangat cepat, tetapi tidak menyokong pertanyaan XPath.

C dan XML: Meneroka hubungan dan sokonganC dan XML: Meneroka hubungan dan sokonganApr 21, 2025 am 12:02 AM

C Berinteraksi dengan XML melalui perpustakaan pihak ketiga (seperti TinyXML, PugixML, Xerces-C). 1) Gunakan perpustakaan untuk menghuraikan fail XML dan menukarnya ke dalam struktur data C-diproses. 2) Apabila menjana XML, tukar struktur data C ke format XML. 3) Dalam aplikasi praktikal, XML sering digunakan untuk fail konfigurasi dan pertukaran data untuk meningkatkan kecekapan pembangunan.

C# vs C: Memahami perbezaan dan persamaan utamaC# vs C: Memahami perbezaan dan persamaan utamaApr 20, 2025 am 12:03 AM

Perbezaan utama antara C# dan C ialah sintaks, prestasi dan senario aplikasi. 1) Sintaks C# lebih ringkas, menyokong pengumpulan sampah, dan sesuai untuk pembangunan rangka kerja .NET. 2) C mempunyai prestasi yang lebih tinggi dan memerlukan pengurusan memori manual, yang sering digunakan dalam pengaturcaraan sistem dan pembangunan permainan.

C# vs C: Sejarah, evolusi, dan prospek masa depanC# vs C: Sejarah, evolusi, dan prospek masa depanApr 19, 2025 am 12:07 AM

Sejarah dan evolusi C# dan C adalah unik, dan prospek masa depan juga berbeza. 1.C dicipta oleh BjarnestroustRup pada tahun 1983 untuk memperkenalkan pengaturcaraan berorientasikan objek ke dalam bahasa C. Proses evolusinya termasuk pelbagai standardisasi, seperti C 11 memperkenalkan kata kunci auto dan ekspresi Lambda, C 20 memperkenalkan konsep dan coroutin, dan akan memberi tumpuan kepada pengaturcaraan prestasi dan sistem pada masa akan datang. 2.C# telah dikeluarkan oleh Microsoft pada tahun 2000. Menggabungkan kelebihan C dan Java, evolusinya memberi tumpuan kepada kesederhanaan dan produktiviti. Sebagai contoh, C#2.0 memperkenalkan generik dan C#5.0 memperkenalkan pengaturcaraan tak segerak, yang akan memberi tumpuan kepada produktiviti pemaju dan pengkomputeran awan pada masa akan datang.

C# vs C: Lembaran Lelajaran dan Pengalaman PemajuC# vs C: Lembaran Lelajaran dan Pengalaman PemajuApr 18, 2025 am 12:13 AM

Terdapat perbezaan yang signifikan dalam lengkung pembelajaran C# dan C dan pengalaman pemaju. 1) Keluk pembelajaran C# agak rata dan sesuai untuk pembangunan pesat dan aplikasi peringkat perusahaan. 2) Keluk pembelajaran C adalah curam dan sesuai untuk senario kawalan berprestasi tinggi dan rendah.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat

Pelayar Peperiksaan Selamat ialah persekitaran pelayar selamat untuk mengambil peperiksaan dalam talian dengan selamat. Perisian ini menukar mana-mana komputer menjadi stesen kerja yang selamat. Ia mengawal akses kepada mana-mana utiliti dan menghalang pelajar daripada menggunakan sumber yang tidak dibenarkan.

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft