0902 C++類的匿名對象

Part 1.梳理思維導圖

一.匿名對象

? ? ? ? 1.概念

沒有對象名的類對象

? ? ? ? 2.格式

類名();

? ? ? ? 3.作用

1.給有名對象初始化

2.給對象數組初始化

3.作為函數的參數傳遞給形參

? ? ? ? 4.例子

#include <iostream>using namespace std;class Dog
{friend void Dogfriend(Dog &b);
private:string name;int age;
public:Dog(){}Dog(string name,int age):name(name),age(age){cout << name << " " << age << endl;}
};
void Dogfriend(Dog &d)
{cout << d.name << endl;cout << d.age << endl;
}int main()
{Dog("白",9);//匿名對象Dog d1 = Dog("黑",6);//給有名對象初始化Dogfriend(d1);//作為函數的參數return 0;
}

? ? ? ? 5.總結

匿名對象相較于有名對象,簡化了對于對象名的定義,在函數傳參時,可以不用先初始化,在進行對象名傳參,更加快捷方便

二.友元

? ? ? ? 1.作用

讓一些函數或者類,去訪問另一個類的私有屬性

? ? ? ? 2.種類

1.全局函數作為友元

2.類作為友元

3.成員函數作為友元

? ? ? ? 3.全局函數作為友元

定義一個函數進行訪問類中的私有屬性,照常來說是不能訪問的,在類的最前面加上friend,就是給函數作為友元,則可以訪問私有屬性

#include <iostream>using namespace std;class Dog
{friend void Dogfriend(Dog &b);//全局函數作為友元
private:string name;int age;
public:Dog(){}Dog(string name,int age):name(name),age(age){cout << name << " " << age << endl;}
};
void Dogfriend(Dog &d)
{cout << d.name << endl;cout << d.age << endl;
}int main()
{Dog("白",9);Dog d1 = Dog("黑",6);Dogfriend(d1);return 0;
}

? ? ? ? 4.類作為友元

#include <iostream>using namespace std;class Dog
{friend class Dogfriend;
private:string name;int age;
public:Dog(){}Dog(string name,int age):name(name),age(age){cout << name << " " << age << endl;}
};class Dogfriend
{
private:Dog *d;
public:Dogfriend(string name,int age){d = new Dog(name,age);}void visit(){cout << d->age << endl;cout << d->name << endl;}
};int main()
{Dog("白",9);Dogfriend d1("黑",6);d1.visit();return 0;
}

? ? ? ? 5.成員函數作為友元

在定義訪問類時,需要注意訪問類的成員函數作為友元,這個友元必須得在訪問類完全定義后才能作為友元,所以需要將Dogfriend移到Dog前面,但是由于Dogfriend有使用Dog的成員,所以需要類外定義成員函數

#include <iostream>using namespace std;class Dog;class Dogfriend
{
private:Dog *d;
public:Dogfriend(string name,int age);void visit();};class Dog
{friend void Dogfriend::visit();
private:string name;int age;
public:Dog(){}Dog(string name,int age):name(name),age(age){cout << name << " " << age << endl;}
};Dogfriend::Dogfriend(string name,int age)
{d = new Dog(name,age);
}void Dogfriend::visit()
{cout << d->age << endl;cout << d->name << endl;
}int main()
{Dog("白",9);Dogfriend d1("黑",6);d1.visit();return 0;
}

? ? ? ? 6.總結

1.友元容易破壞類的封裝性,請謹慎使用

2.友元不具有交互性、傳遞性、繼承性

三.常成員函數與常對象

? ? ? ? 1.常成員函數

? ? ? ? ? ? ? ? a.作用

將成員函數定義為常成員函數后,函數不能修改成員的值

? ? ? ? ? ? ? ? b.格式
class 類名
{返回值類型 函數名(形參列表) const // 常成員函數{函數體內容;}
};
? ? ? ? ? ? ? ? c.例子
#include <iostream>using namespace std;class Dog
{
private:string name;int age;
public:Dog(){}Dog(string name,int age):name(name),age(age){}void show()//非常成員函數{age = 3;cout << age <<endl;cout << name << endl;}void show() const//常成員函數{cout << age <<endl;cout << name << endl;}
};int main()
{Dog("白",9);Dog d1 = Dog("黑",6);Dog const d2 = Dog("黃",4);d1.show();d2.show();return 0;
}

? ? ? ? 2.常對象

? ? ? ? ? ? ? ? a.作用

讓該對象的數據成員不能被改變

? ? ? ? ? ? ? ? b.格式
const 類名 對象名
? ? ? ? ? ? ? ? c.注意事項

1.常對象只能調用常成員函數,不能調用非常成員函數

2.非常對象二者都能調用,非常對象默認調用非常成員函數

? ? ? ? ? ? ? ? d.例子
#include <iostream>using namespace std;class Dog
{
private:string name;int age;
public:Dog(){}Dog(string name,int age):name(name),age(age){}void show(){age = 3;cout << age <<endl;cout << name << endl;}void show() const{cout << age <<endl;cout << name << endl;}
};int main()
{Dog("白",9);Dog d1 = Dog("黑",6);Dog const d2 = Dog("黃",4);//常對象d1.show();d2.show();return 0;
}

? ? ? ? 3.mutable關鍵字

? ? ? ? ? ? ? ? a.作用

讓數據成員可以在常成員函數中修改

? ? ? ? ? ? ? ? b.例子
#include <iostream>using namespace std;class Dog
{
private:string name;mutable int age;
public:Dog(){}Dog(string name,int age):name(name),age(age){}void show(){age = 3;cout << age <<endl;cout << name << endl;}void show() const{age = 3;//常成員函數中修改cout << age <<endl;cout << name << endl;}
};int main()
{Dog("白",9);Dog d1 = Dog("黑",6);Dog const d2 = Dog("黃",4);//常對象d1.show();d2.show();return 0;
}

? ? ? ? c.總結

mutable破壞了常成員函數的目的:不改變成員的值。盡量不使用

四.運算符重載

? ? ? ? 1.定義

對運算符進行重新定義,讓其可以適應不同的數據類型

? ? ? ? 2.使用場景

普通的運算符只能運算基本數據類型,構造數據類型無法運算,運算符重載讓重新定義的運算符可以運算構造數據類型

? ? ? ? 3.實現方式

1.成員函數用作運算符重載

2.全局函數用作運算符重載

? ? ? ?4.函數格式

1.成員函數用作運算符重載:

const 類名 operator#(const 類名 &R) const

num n3 = n1+n2; -->num n3 = n1.operator+(n2);

2.全局函數用作運算符重載

const 類名 operator#(const 類名 &L, const 類名 &R)

num n3 = n1+n2; -->num n3 = operator+(n1,n2);

????????4.例子

#include <iostream>using namespace std;class num
{
//    friend const num operator+(const num &L,const num &R);
private:int a;int b;
public:num(){}num(int a,int b):a(a),b(b){}//成員函數用作運算符重載const num operator+(const num &R) const{num temp;temp.a = a + R.a;temp.b = b + R.b;return temp;}const num operator-(const num &R) const{num temp;temp.a = a - R.a;temp.b = b - R.b;return temp;}const num operator*(const num &R) const{num temp;temp.a = a * R.a;temp.b = b * R.b;return temp;}const num operator/(const num &R) const{num temp;temp.a = a / R.a;temp.b = b / R.b;return temp;}void show(){cout << "a = " << a << " b = " << b << endl;}
};//全局函數用作運算符重載
//const num operator+(const num &L,const num &R)
//{
//    num temp;
//    temp.a = L.a + R.a;
//    temp.b = L.b + R.b;
//    return temp;
//}int main()
{num n1(2,3);num n2(3,4);num n3 = n1+n2;num n4 = n1-n2;num n5 = n1*n2;num n6 = n1/n2;n3.show();n4.show();n5.show();n6.show();return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/97747.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/97747.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/97747.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在 PySpark 中解鎖窗口函數的力量,實現高級數據轉換

本篇文章Mastering PySpark Window Functions: A Practical Guide to Time-Based Analytics適合數據分析和工程師入門了解PySpark的窗口函數。文章的亮點在于詳細介紹了窗口函數的基本概念及其在銷售數據分析中的實際應用&#xff0c;幫助讀者理解如何進行復雜的數據計算而無需…

從理念到實踐:三層解耦架構與“無系統”論

在上一篇中&#xff0c;我們揭示了“五層雙閉環”治理模型如何像骨骼一樣&#xff0c;為數字化轉型提供支撐和定型。但再宏偉的藍圖也需要堅實的施工來實現。今天&#xff0c;我們將深入最具體的實施層面&#xff0c;將“業務重塑”和“以人為本”的理念&#xff0c;轉化為可落…

詳細介紹Linux 內存管理struct page數據結構中的_count和_mapcount有什么區別?

在Linux內核的struct page中&#xff0c;_count&#xff08;或_refcount&#xff09;和_mapcount是兩個關鍵的引用計數成員&#xff0c;它們各自承擔不同的職責。以下是深度解析和代碼案例&#xff1a;1. _count vs _mapcount 區別詳解_count&#xff08;或_refcount&#xff0…

面陣 vs 線陣相機:怎么選不踩坑?選型公式直接套用

面陣vs線陣相機&#xff1a;怎么選不踩坑&#xff1f;選型公式直接套用&#x1f3af;面陣vs線陣相機怎么選不踩坑&#xff1f;&#x1f3af;一、面陣相機&#xff1a;工業檢測的“萬能選手”&#xff0c;拍全圖靠它&#x1f3af;二、線陣相機&#xff1a;大視野/高精度的“專屬…

Spring Security 如何使用@PreAuthorize注解

&#x1f9f1; 第一步&#xff1a;環境準備? 1. 創建數據庫&#xff08;MySQL&#xff09;-- 創建數據庫&#xff0c;使用 utf8mb4 字符集支持 emoji 和多語言 CREATE DATABASE security_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 使用該數據庫 USE security…

JVM中產生OOM(內存溢出)的8種典型情況及解決方案

Java中的OutOfMemoryError&#xff08;OOM&#xff09;是當JVM內存不足時拋出的錯誤。本文將全面剖析JVM中產生OOM的各種情況&#xff0c;包括堆內存溢出、方法區溢出、棧溢出等&#xff0c;并提供詳細的診斷方法和解決方案。 一、OOM基礎概念 1.1 OOM錯誤類型 Java中的OOM是…

【IEEE出版、EI檢索、往屆會后3個月檢索】第四屆信號處理、計算機網絡與通信國際學術會議(SPCNC 2025)

第四屆信號處理、計算機網絡與通信國際學術會議&#xff08;SPCNC 2025&#xff09;將于2025年12月5-7日于中國武漢召開&#xff08;線上同步&#xff09;。為本次會議旨在齊聚海內外信號處理、計算機網絡與通信等計算機領域的專家學者&#xff0c;為相關領域研究和從業人員提供…

Spring boot注解介紹

1. Spring 核心注解Spring Boot 是基于 Spring 框架的&#xff0c;所以核心注解依然適用。? 常見核心注解Component表示一個通用組件&#xff0c;Spring 會自動掃描并注入到容器中。Component public class MyComponent {public void sayHello() {System.out.println("He…

撤銷回退 情況?:已經 add ,但沒有 commit

撤銷回退 情況?&#xff1a;已經 add &#xff0c;但沒有 commit add 后還是保存到了暫存區呢&#xff1f;怎么撤銷呢&#xff1f; 1 # 向ReadMe中新增??代碼 2 hyb139-159-150-152:~/gitcode$ vim ReadMe 3 hyb139-159-150-152:~/gitcode$ cat ReadMe 4 hello bit 5 hell…

【Linux筆記】命令行與vim基礎

一、Linux命令行基礎 1. 基本語法命令空格參數&#xff08;可寫可不寫&#xff09;空格文件&#xff0c;文件夾&#xff08;可寫可不寫&#xff09;ls列出文件夾中的內容/opt 根目錄下的opt文件夾ls-a all顯示出所有文件以及隱藏文件/optls-a如果不寫則輸出一個點&#xff0c;當…

Redis 的整數集合:像分類收納盒一樣的整數專屬存儲

目錄 一、先懂定位&#xff1a;為什么需要整數集合&#xff1f;&#xff08;銜接哈希表&#xff09; 二、整數集合的結構&#xff1a;像 “貼了規格標簽的收納盒” 1. encoding&#xff1a;收納盒的 “規格標簽”&#xff08;核心&#xff1a;決定格子大小&#xff09; 2. …

Linux 進程狀態 — 僵尸進程

&#x1f381;個人主頁&#xff1a;工藤新一 &#x1f50d;系列專欄&#xff1a;C面向對象&#xff08;類和對象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;終會照亮我前方的路 &#x1f389;歡迎大家點贊&#x1f44d;評論&#x1f4dd;收藏?文章 文章目錄進…

React 中 key 的作用

React 中 key 的作用是什么&#xff1f; Date: August 31, 2025 Area: 原理key 概念 在 React 中&#xff0c;key 用于識別哪些元素是變化、添加或刪除的。 在列表渲染中&#xff0c;key 尤其重要&#xff0c;因為它能提高渲染性能和確保組件狀態的一致性。key 的作用 1&#x…

wpf之附加屬性

前言 附加屬性是 WPF 中一個非常強大和獨特的概念。簡單來說&#xff0c;它允許一個對象為另一個在其本身類定義中未定義的屬性賦值。 1、定義附加屬性 定義一個Watermark的附加屬性&#xff0c;該屬性的作用是將TextBox的附加屬性改變時&#xff0c;TextBox的字體顏色改成灰…

深入淺出 RabbitMQ-消息可靠性投遞

大家好&#xff0c;我是工藤學編程 &#x1f989;一個正在努力學習的小博主&#xff0c;期待你的關注實戰代碼系列最新文章&#x1f609;C實現圖書管理系統&#xff08;Qt C GUI界面版&#xff09;SpringBoot實戰系列&#x1f437;【SpringBoot實戰系列】SpringBoot3.X 整合 Mi…

數字化時代,中小企業如何落地數字化轉型

大數據時代&#xff0c;各行各業的行業龍頭和大型集團都已經開始了數據管理&#xff0c;讓數據成為數據資產。但是在我國&#xff0c;中小企業的數量巨大&#xff0c;很多管理者忽視了這一點&#xff0c;今天我們就來聊一聊中小企業的數字化轉型。中小企業需要數字化轉型首先要…

Unity筆記(九)——畫線功能Linerenderer、范圍檢測、射線檢測

寫在前面&#xff1a;寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解&#xff0c;方便自己以后快速復習&#xff0c;減少遺忘。這里只記錄代碼知識。十一、畫線功能Linerenderer畫線功能Linerenderer是Unity提供的畫線腳本&#xff0c;創建一個空…

刷題記錄(8)string類操作使用

一、僅反轉字母 917. 僅僅反轉字母 - 力扣&#xff08;LeetCode&#xff09; 簡單來說輸入字符串&#xff0c;要求你返回所有僅字母位置反轉后的字符串。 簡單看一個樣例加深理解&#xff1a; 前后互換&#xff0c;我想思路基本很明顯了&#xff0c;雙指針&#xff0c;或者說…

用好AI,從提示詞工程到上下文工程

前言 隨著 AI 大模型的爆發,提示詞工程(prompt engineering ) 一度是用戶應用 AI ,發揮 AI 能力最重要、也最應該掌握的技術。 但現在,在 “提示詞工程”的基礎上,一個更寬泛也更強力的演化概念被提出,也就是本文我們要介紹的 “上下文工程(Context Engineering)” …

計算機Python畢業設計推薦:基于Django+Vue用戶評論挖掘旅游系統

精彩專欄推薦訂閱&#xff1a;在下方主頁&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主頁&#xff1a;計算機畢設木哥&#x1f525; &#x1f496; 文章目錄 一、項目介紹二、…