c++中不能重载的运算符有哪些
c++中不能重载的运算符有5个:“?:”、“.”、“::”、“sizeof”、“.*” 。 “.”和“::”运算符如果重载,可能会出现混淆;“sizeof”运算符不能重载是因为内部许多指针都依赖它;“.*”运算符引用指向类成员的指针。
本教程操作环境:windows7系统、C++17版本、Dell G3电脑。
C++中不能重载的运算符有5个,分别为:“?:” “.” “::” “sizeof” “.*” 。
重载:让操作符可以有新的语义,而不是更改语法,否则会引起混乱。
重载的部分规则:运算函数的参数至少有一个必须是类的对象或者是类的对象的引用。
下面来解释一下为什么这几个运算符不能进行重载。
(1)?:
假设可以重载,那么我们来看下列的代码:
exp1 ? exp2 : exp3
该运算符的含义是执行exp2和exp3中的一个,假设重载了,就不可以保证执行一个还是两个,还是都没执行,该运算符的跳转性质就不复存在了。所以,“?:”不能被重载。
(2).
假设可以重载,我们可以假设一种情况,创建一个对象,调用该对象的函数。
class Y{ public: void fun(); }; class X{ public: Y* p; Y& operator.(){ return *p; } void fun(); } void g(X& x){ x.fun(); }
这个例子中,x.fun()就不知道是调用哪一个fun函数了。
“.”运算符的含义是引用对象成员,然而被重载后就不能保证了,导致运算符意义的混淆。
(3)::
该运算符只是在编译的时候域解析,而没有运算参与。根据重载的规则,如果重载该运算符,就赋予了新的语义,可能会出现混淆。
(4)sizeof
不能被重载的原因主要是内部许多指针都依赖sizeof。
(5).*
引用指向类成员的指针
扩展资料:
重载运算符遵守的原则:
1. 被重载的操作符不可以通过连接其他符号来创建新的操作符。
2. 重载操作符必须有一个类类型或者枚举类型的操作数。
3. 内置类型的操作符,含义不能改变,如整数加法(+)。
4. 重载后的运算符不可以保证操作符的顺序。
5. 类成员的重载函数,其形参隐含一个默认的this指针。
6. 一般将赋值运算符定义为成员函数,将算数运算符定义为非成员函数。
7. 操作符定义为非类的成员函数时,一般将其定义为类的友元。
8. == 与 != 要成对出现。
9. 下标运算符[]:一个非const成员并返回引用,一个是const成员并返回引用。
10. * 与 -> 操作符,不显示任何参数。
11. 前置 ++/-- 必须返回被增量或者减量的引用。
12. 输入操作符和输出操作符必须定义为类的友元函数。
更多编程相关知识,请访问:编程入门!!
Atas ialah kandungan terperinci c++中不能重载的运算符有哪些. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Langkah-langkah untuk melaksanakan corak strategi dalam C++ adalah seperti berikut: tentukan antara muka strategi dan isytiharkan kaedah yang perlu dilaksanakan. Buat kelas strategi khusus, laksanakan antara muka masing-masing dan sediakan algoritma yang berbeza. Gunakan kelas konteks untuk memegang rujukan kepada kelas strategi konkrit dan melaksanakan operasi melaluinya.

Golang dan C++ masing-masing adalah sampah yang dikumpul dan bahasa pengaturcaraan pengurusan memori manual, dengan sistem sintaks dan jenis yang berbeza. Golang melaksanakan pengaturcaraan serentak melalui Goroutine, dan C++ melaksanakannya melalui benang. Pengurusan memori Golang adalah mudah, dan C++ mempunyai prestasi yang lebih kukuh. Dalam kes praktikal, kod Golang adalah lebih ringkas dan C++ mempunyai kelebihan prestasi yang jelas.

Pengendalian pengecualian bersarang dilaksanakan dalam C++ melalui blok try-catch bersarang, membenarkan pengecualian baharu dibangkitkan dalam pengendali pengecualian. Langkah-langkah cuba-tangkap bersarang adalah seperti berikut: 1. Blok cuba-tangkap luar mengendalikan semua pengecualian, termasuk yang dilemparkan oleh pengendali pengecualian dalam. 2. Blok cuba-tangkap dalam mengendalikan jenis pengecualian tertentu, dan jika pengecualian luar skop berlaku, kawalan diberikan kepada pengendali pengecualian luaran.

Untuk lelaran ke atas bekas STL, anda boleh menggunakan fungsi begin() dan end() bekas untuk mendapatkan julat lelaran: Vektor: Gunakan gelung for untuk lelaran ke atas julat lelaran. Senarai terpaut: Gunakan fungsi ahli seterusnya() untuk melintasi elemen senarai terpaut. Pemetaan: Dapatkan iterator nilai kunci dan gunakan gelung for untuk melintasinya.

Warisan templat C++ membenarkan kelas terbitan templat menggunakan semula kod dan kefungsian templat kelas asas, yang sesuai untuk mencipta kelas dengan logik teras yang sama tetapi gelagat khusus yang berbeza. Sintaks warisan templat ialah: templateclassDerived:publicBase{}. Contoh: templateclassBase{};templateclassDerived:publicBase{};. Kes praktikal: Mencipta kelas terbitan Derived, mewarisi fungsi mengira Base kelas asas, dan menambah kaedah printCount untuk mencetak kiraan semasa.

Templat C++ digunakan secara meluas dalam pembangunan sebenar, termasuk templat kelas kontena, templat algoritma, templat fungsi generik dan templat pengaturcaraan meta. Sebagai contoh, algoritma pengisihan generik boleh mengisih tatasusunan jenis data yang berbeza.

Punca dan penyelesaian untuk kesilapan Apabila menggunakan PECL untuk memasang sambungan dalam persekitaran Docker Apabila menggunakan persekitaran Docker, kami sering menemui beberapa sakit kepala ...

Bagaimana untuk mengakses elemen dalam bekas C++ STL? Terdapat beberapa cara untuk melakukan ini: Melintasi bekas: Gunakan lelaran Berasaskan julat untuk gelung untuk mengakses elemen tertentu: Gunakan indeks (pengendali subskrip []) Gunakan kekunci (std::map atau std::unordered_map)
