網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1.類(lèi)外運(yùn)算符重載
class Point {
private:
int x,y;
public:
// 系統(tǒng)C++源碼,大量使用此方式 :x(x), y(y)
Point(int x, int y) :x(x), y(y) {}
// set get 函數(shù)
void setX(int x) {
this->x = x;
}
void setY(int y) {
this->y = y;
}
int getX() {
return this->x;
}
int getY() {
return this->y;
}
};
/*類(lèi)外運(yùn)算符重載
* 在真實(shí)開(kāi)發(fā)過(guò)程中,基本上都是寫(xiě)在類(lèi)的里面的,外部是不能獲取內(nèi)部的私有成員的
* */
Point operator + (Point point1,Point point2){
int x = point1.getX() + point2.getX();
int y = point1.getY() + point2.getY();
Point res(x, y);
return res;
}
int main(){
Point pointA(10,20);
Point pointB(10,20);
Point pointC=pointA+pointB;
cout << pointC.getX() << " , " << pointC.getY() << endl;
}
日志輸出:
20 , 40
兩個(gè)對(duì)象做+法運(yùn)算就是執(zhí)行了運(yùn)算符重載函數(shù)
2.類(lèi)內(nèi)部運(yùn)算符號(hào)重載
class Point {
private:
int x,y;
public:
Point(){}
// 系統(tǒng)C++源碼,大量使用此方式 :x(x), y(y)
Point(int x, int y) :x(x), y(y) {}
// set get 函數(shù)
void setX(int x) {
this->x = x;
}
void setY(int y) {
this->y = y;
}
int getX() {
return this->x;
}
int getY() {
return this->y;
}
/*
* 常量引用:不允許修改,只讀模式
* & 性能的提高,如果沒(méi)有& 運(yùn)行+ 構(gòu)建新的副本,會(huì)浪費(fèi)性能
* 如果增加了& 引用是給這塊內(nèi)存空間取一個(gè)別名而已
* */
Point operator + (const Point & point){
int x=this->x+point.x;
int y=this->y+point.y;
return Point(x,y);
}
Point operator - (const Point & point){
int x=this->x-point.x;
int y=this->y-point.y;
return Point(x,y);
}
void operator ++() { // ++對(duì)象
this->x = this->x + 1;
this->y = this->y + 1;
}
void operator ++ (int) { // 對(duì)象++
this->x = this->x + 1;
this->y = this->y + 1;
}
/*重載<< 輸出運(yùn)算符號(hào)
* istream 輸入 系統(tǒng)的
* ostream 輸出 系統(tǒng)的
* */
/* friend void operator << (ostream & _START,Point &point){
_START << " 開(kāi)始輸出 " << point.x << " : " << point.y << " 結(jié)束了 " << endl;
}*/
/*多個(gè)<< 連著寫(xiě) */
friend ostream & operator << (ostream & _START,Point &point){
_START << " 開(kāi)始輸出 " << point.x << " : " << point.y << " 結(jié)束了 " << endl;
return _START;
}
// istream 輸入 系統(tǒng)的
friend istream & operator >> (istream & _START, Point & point) {
// 接收用戶(hù)的輸入,把輸入的信息
_START >> point.x >> point.y;
return _START;
}
};
int main(){
Point pointA(30,50);
Point pointB(10,20);
// Point pointC=pointA-pointB;
++pointA;
// cout << pointA.getX() << " , " << pointA.getY() << endl;
cout << pointA << pointB <<endl; // 多個(gè)的
Point pointC;
cin >> pointC; // >> 是我們自己重載的哦
cout << "你輸入的是:" << pointC.getX() << endl;
cout << "你輸入的是:" << pointC.getY() << endl;
}
- 類(lèi)內(nèi)部運(yùn)算符重載,允許訪(fǎng)問(wèn)私有變量
- 傳入的參數(shù)是常量引用,const 表示不可更改,& 可以提升性能,只會(huì)有一個(gè)變量別名,不加會(huì)拷貝一份,浪費(fèi)內(nèi)存。
- << >> 重載,需要加friend 友元函數(shù)來(lái)進(jìn)行重載
- ostream & _START:表示輸出
- istream & _START:表示輸入
3.[] 運(yùn)算符號(hào)重載
class ArrayClass {
private:
int size =0 ; // 大小 開(kāi)發(fā)過(guò)程中,給size賦默認(rèn)值,不然可能會(huì)出現(xiàn),無(wú)窮大的問(wèn)題
int * arrayValue; // 數(shù)組存放 int 類(lèi)型的很多值
public:
ArrayClass(){
/*指針類(lèi)型必須分配空間*/
arrayValue= static_cast<int *>(malloc(sizeof(int *) * 10));
}
void set(int index, int value) {
arrayValue[index] = value; // []目前不是我的
size+=1;
}
int getSize() { // size成員的目標(biāo):是為了循環(huán)可以遍歷
return this->size;
}
// 運(yùn)算符重載 [index]
int operator[](int index) {
return this->arrayValue[index]; // 系統(tǒng)的
}
};
// 輸出容器的內(nèi)容
void printfArryClass(ArrayClass arrayClass) {
cout << arrayClass.getSize() << endl;
for (int i = 0; i < arrayClass.getSize(); ++i) {
cout << arrayClass[i] << endl; // []是我們自己的 重載符號(hào)
}
}
int main(){
ArrayClass arrayClass; // 棧區(qū) 實(shí)例出來(lái)的對(duì)象,是在堆區(qū)了
arrayClass.set(0, 100);
arrayClass.set(1, 200);
arrayClass.set(2, 300);
arrayClass.set(3, 400);
arrayClass.set(4, 500);
printfArryClass(arrayClass);
}
4.c++繼承
class Person {
public:
char *name;
int age;
public:
Person(char *name, int age) : name(name) {
this->age = age;
cout << "Person 構(gòu)造函數(shù)" << endl;
}
void print() {
cout << this->name << " , " << this->age << endl;
}
};
class Student : public Person {
private:
char * course;
public:
Student(char * name, int age, char* course) : Person(name, age) , course(course) {
cout << "Student 構(gòu)造函數(shù)" << endl;
}
void test() {
cout << name << endl;
cout << age << endl;
print();
}
};
- 默認(rèn)是 隱式代碼: : private Person
- 私有繼承:在子類(lèi)里面是可以訪(fǎng)問(wèn)父類(lèi)的成員,但是在類(lèi)的外面不行
- 必須公開(kāi)繼承,才可以訪(fǎng)問(wèn)父類(lèi)的成員
- 先執(zhí)行父類(lèi)的構(gòu)造函數(shù),再執(zhí)行子類(lèi)的構(gòu)造函數(shù)
5.多繼承
class BaseActivity1 {
public:
void onCreate() {
cout << "BaseActivity1 onCreate" << endl;
}
void onStart() {
cout << "BaseActivity1 onStart" << endl;
}
void show() {
cout << "BaseActivity1 show" << endl;
}
};
class BaseActivity2 {
public:
void onCreate() {
cout << "BaseActivity2 onCreate" << endl;
}
void onStart() {
cout << "BaseActivity2 onStart" << endl;
}
void show() {
cout << "BaseActivity2 show" << endl;
}
};
// 子類(lèi) 繼承 二個(gè)父類(lèi)
class MainActivity1 : public BaseActivity1, public BaseActivity2{
public:
void onCreate() {
cout << "MainActivity1 onCreate" << endl;
}
void onStart() {
cout << "MainActivity1 onStart" << endl;
}
void showSonInfo() {
cout << "MainActivity1 showSonInfo" << endl;
}
// void show() {
// cout << "MainActivity1 show" << endl;
//}
};
int main(){
// 這個(gè)是優(yōu)先尋找子類(lèi)的函數(shù),因?yàn)樘貏e明確,沒(méi)有問(wèn)題,還沒(méi)有產(chǎn)生歧義(二義性)
MainActivity1 mainActivity1; // 子類(lèi)
mainActivity1.onCreate();
mainActivity1.onStart();
mainActivity1.showSonInfo();
// 不明確,二義性,歧義 /*request for member ‘show' is ambiguous*/
// mainActivity1.show();
/*解決二義性 通過(guò).來(lái)引出父類(lèi) 然后再調(diào)用*/
mainActivity1.BaseActivity3::show();
mainActivity1.BaseActivity2::show();
mainActivity1.BaseActivity1::show();
// 解決方案二: 子類(lèi)上 重寫(xiě)父類(lèi)的show函數(shù)
mainActivity1.show();
}
- c++ 允許多繼承,可能會(huì)出現(xiàn)二義性,原則上是盡量避免二義性
- 通過(guò)明確父類(lèi)的方式解決二義性
- 通過(guò)子類(lèi)重寫(xiě)父類(lèi)的方法規(guī)避二義性
6.通過(guò)虛繼承來(lái)解決二義性問(wèn)題
// 祖父類(lèi)
class Object{
public:
int number;
void show() {
cout << "Object show run..." << endl;
}
};
// 父類(lèi)1
class BaseActivity1 : virtual public Object {
};
// 父類(lèi)2
class BaseActivity2 : virtual public Object {
};
// 子類(lèi)
class Son : public BaseActivity1, public BaseActivity2 {
};
int main(){
Object object;
BaseActivity1 baseActivity1;
BaseActivity2 baseActivity2;
Son son;
object.number = 100;
baseActivity1.number = 200;
baseActivity2.number = 300;
son.number = 400;
object.show();
baseActivity1.show();
baseActivity2.show();
son.show();
cout << object.number << endl;
cout << baseActivity1.number << endl;
cout << baseActivity2.number << endl;
cout << son.number << endl;
}
- 如果沒(méi)有虛繼承,那么son對(duì)象訪(fǎng)問(wèn)number就會(huì)報(bào)二義性的問(wèn)題,同時(shí)訪(fǎng)問(wèn)show方法同樣存在二義性問(wèn)題
- 由于在繼承的時(shí)候添加了虛繼承,就能解決類(lèi)似這樣的問(wèn)題,虛繼承的含義是:將通過(guò)繼承得來(lái)的number和show方法,放置在另外一個(gè)統(tǒng)一空間上,這樣子類(lèi)再訪(fǎng)問(wèn)的時(shí)候就不會(huì)出現(xiàn)二義性的問(wèn)題了。
原文鏈接:https://blog.csdn.net/u014078003/article/details/126264102
相關(guān)推薦
- 2022-08-01 Qt實(shí)現(xiàn)矩形大小任意縮放的示例代碼_C 語(yǔ)言
- 2022-04-30 LINQ投影操作符Select與限制操作符where介紹_C#教程
- 2022-05-23 python中的netCDF4批量處理NC文件的操作方法_python
- 2022-03-24 C語(yǔ)言指針的圖文詳解_C 語(yǔ)言
- 2023-06-20 IDEA中的Redis插件連接Redis服務(wù)器_Redis
- 2022-07-11 Android Studio環(huán)境配置
- 2022-07-30 jQuery?UI菜單部件Menu?Widget_jquery
- 2022-05-10 thymeleaf給響應(yīng)頁(yè)面?zhèn)鬟f參數(shù)(modelandview 中的model)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支