国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

c++學習(day4)

這篇具有很好參考價值的文章主要介紹了c++學習(day4)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一. 友元(friend)

友元是一種定義在類外部的普通函數(shù)或類

1 友元函數(shù)

1.1 全局函數(shù)作為友元函數(shù)

聲明一個全局函數(shù)作為類的友元函數(shù),則允許該全局函數(shù),訪問類中各個權(quán)限下的成員

在類中要將該函數(shù)進行聲明:friend 全局函數(shù)頭;

#include <iostream>
using namespace std;

class Stu
{
private:
    string name;
    int age;
public:
    Stu() {}
    Stu(string n, int a) : name(n), age(a) {}

    void show()
    {
        cout << "name = " << name << "   age = " << age << endl;
    }

    friend void display(Stu s); // 在類中將全局函數(shù)聲明成類的友元函數(shù)
};

// 定義全局函數(shù)
void display(Stu s)
{
    cout << "name = " << s.name << "   age = " << s.age << endl; // 正常的全局函數(shù)不能訪問類中私有屬性
}

int main()
{
    display(Stu("zhangpp", 18));

    return 0;
}

1.2 類的成員函數(shù)作為友元函數(shù)(了解)

  1. 聲明一個其他類的成員函數(shù)作為自己類的友元函數(shù),則允許讓該函數(shù)訪問自己類中的所有成員

  2. 要求該函數(shù)必須類內(nèi)聲明類外定義

2. 友元類

  1. 在一個類中聲明另一個類當做友元類,則允許友元類中所有成員訪問自己的所有權(quán)限下的成員

  2. 聲明格式:friend class 類名;

#include <iostream>

using namespace std;

class Stu; // 類的前置聲明

class Teacher // 老師類
{
private:
    string sub;

public:
    Teacher() {}
    Teacher(string s) : sub(s) {}

    void show(Stu s); // 類內(nèi)聲明
};

class Stu // 學生類
{
private:
    string name;
    int age;

public:
    Stu() {}
    Stu(string n, int a) : name(n), age(a) {}

    void show()
    {
        cout << "name = " << name << "   age = " << age << endl;
    }

    friend void display(Stu s); // 在類中將全局函數(shù)聲明成類的友元函數(shù)

    // friend void Teacher::show(Stu s);             //聲明老師類中的成員函數(shù)作為友元函數(shù)

    // 將整個Teacher類當做友元類
    friend class Teacher;
};

// 定義全局函數(shù)
void display(Stu s)
{
    cout << "name = " << s.name << "   age = " << s.age << endl; // 正常的全局函數(shù)不能訪問類中私有屬性
}

// 老師類中的成員函數(shù)的定義
void Teacher::show(Stu s)
{
    cout << "Teacher::sub = " << sub << endl;
    cout << "Stu::name = " << s.name << endl; // 其他類不能訪問類中私有成員
}

int main()
{
    display(Stu("zhangpp", 18));
    Teacher t1("C++");
    t1.show(Stu("zhangpp", 18));
    return 0;
}

3. 使用友元的注意事項

  1. 友元具有方向性,A把B當做朋友,允許B訪問A的所有權(quán)限,但是A不一定能訪問B的所有權(quán)限

  2. 友元不具有交換性:A是B的朋友,但B不一定是A的朋友

  3. 友元不具有傳遞性:A是B的朋友,B是C的朋友,則A不一定是C的朋友

  4. 友元不具有繼承性:父類的朋友不一定是子類的朋友

  5. 由于友元的出現(xiàn),破壞了了類的封裝性,使得訪問權(quán)限形同虛設(shè)。所以不在萬不得已的情況下,盡可能少用友元

  6. 必須使用友元的情況:插入和提取運算符重載。(后期講)

二. 常成員函數(shù)和常對象(const)

1. 常成員函數(shù)

由const修飾的成員函數(shù)叫常成員函數(shù)

格式:

  • 返回類型 成員函數(shù)名(參數(shù)表) const;

    例如:int function(int x) const

?

特點:

  1. 在常成員函數(shù)中,不能修改成員變量的值(保護成員變量不被修改)

  2. 類中同名的常成員函數(shù)和非常成員函數(shù)構(gòu)成重載關(guān)系,原因是隱藏的this指針的類型不同

    非常成員函數(shù)中: Stu * const  this
    常成員函數(shù)中:	  const Stu * const this
    
  3. 非常對象,優(yōu)先調(diào)用非常成員函數(shù),如果沒有非常成員函數(shù),則去調(diào)用同名的常成員函數(shù)

  4. 常對象只能調(diào)用常成員函數(shù),沒有常成員函數(shù)會報錯

2. 常對象

const修飾的對象為常對象

  1. 常對象只能調(diào)用常成員函數(shù),不能調(diào)用非常成員函數(shù)

  2. 當一個常引用的目標為非常對象,則通過引用只能調(diào)用常成員函數(shù),通過對象優(yōu)先調(diào)用非常成員函數(shù)

3. mutable關(guān)鍵字

功能:

? 取消成員常屬性

使用方式:

? 定義變量前加mutable,那么,該變量就能在常成員函數(shù)中被修改

#include <iostream>

using namespace std;

class Stu
{
private:
    string name;
    mutable int age; // 由mutable關(guān)鍵字修飾的成員變量,能在常成員函數(shù)中被修改
    double score;

public:
    Stu() {}
    Stu(string n, int a, double s) : name(n), age(a), score(s) {}

    // 有const修飾的成員函數(shù)就是常成員函數(shù)
    void show() const // const Stu * const this;
    {
        // this = nullptr;
        // this->score = 50; // 在常成員函數(shù)中不能修改成員變量的值
        this->age = 100; // 可以更改,因為有關(guān)鍵字修飾
        cout << "name = " << name << endl;
        cout << "age = " << age << endl;
        cout << "score = " << score << endl;
        cout << "AAAAAAAAAAAAAAAAAAAAAA" << endl;
    }

    void show() // Stu * const this;
    {
        this->score = 50; // 在常成員函數(shù)中不能修改成員變量的值
        cout << "name = " << name << endl;
        cout << "age = " << age << endl;
        cout << "score = " << score << endl;
        cout << "BBBBBBBBBBBBBBBBBBBBBBBB" << endl;
    }
};

int main()
{
    Stu s1("張三", 20, 99);
    s1.show(); // 50

    const Stu &r = s1;

    r.show();  // 常成員函數(shù)
    s1.show(); // 優(yōu)先調(diào)用非常成員函數(shù)

    return 0;
}

三. 運算符重載

單、算、關(guān)、邏、條、賦、逗

c++學習(day4)

1. 定義

所謂運算符重載,就是給運算符新的含義,能夠?qū)崿F(xiàn)“一符多用”,也是屬于靜態(tài)多態(tài)的一種,

他能夠?qū)崿F(xiàn)將原本加載到基本數(shù)據(jù)類型的運算符,在自定義類對象減使用。

好處:能夠使得代碼更加簡潔、易懂,優(yōu)雅好看

2. 重載的方法

統(tǒng)一的名稱:

? operator# //#表示運算符

3. 運算符重載要求

功能:

? 實現(xiàn)運算符對應(yīng)的操作

參數(shù):

? 由運算符本身決定

返回值:

? 由用戶自己決定

4. 調(diào)用時機及調(diào)用原則

調(diào)用時機:當使用該運算符時,系統(tǒng)自動調(diào)用,無需手動調(diào)用

調(diào)用原則:左調(diào)右參 //a = b; a.operator=(b)

5. 運算符重載的格式

每種運算符都有兩個版本的格式:

  • 成員函數(shù)版本,類對象本身就是一個參數(shù),形參個數(shù)是操作數(shù)個數(shù)-1

  • 全局函數(shù)版,需要使用友元完成,此時參數(shù)個數(shù)等于操作數(shù)個數(shù)

以上兩個版本的重載函數(shù),只能實現(xiàn)一個,否則調(diào)用時會混亂報錯

5.1 算術(shù)類運算符重載(雙目運算符)

種類:

? +、-、*、/、%。。。

表達式:

? L#R //L表示左操作數(shù),#表示運算符,R表示右操作數(shù)

  • 左操作數(shù):既可以是左值也可以是右值

  • 右操作數(shù):既可以是左值也可以是右值

  • 結(jié)果:右值

定義格式:

  • 成員函數(shù)版:const 類名 operator#( const 類名 &R ) const

第一個const:保護返回結(jié)果不被改變

第二個const:保護右操作數(shù)不被修改

第三個const:保護左操作數(shù)不被修改

  • 全局函數(shù)版:const 類名 operator#(const 類名 &L, const 類名 &R)

5.2 賦值類運算符重載

種類:

? =、-=、*=、/=、%=、+=。。。

表達式:

? L#R //L表示左操作數(shù),#表示運算符,R表示右操作數(shù)

  • 左操作數(shù):只能是左值

  • 右操作數(shù):既可以是左值也可以是右值

  • 結(jié)果:右值

定義格式:

  • 成員函數(shù)版: 類名 & operator#( const 類名 &R )

  • 全局函數(shù)版: 類名 & operator#(類名 &L, const 類名 &R)

5.3 關(guān)系運算符重載

種類:

? >=、<=、!=、>、<、==。。。

表達式:

? L#R //L表示左操作數(shù),#表示運算符,R表示右操作數(shù)

  • 左操作數(shù):既可以是左值也可以是右值

  • 右操作數(shù):既可以是左值也可以是右值

  • 結(jié)果:bool類型的右值

定義格式:

  • 成員函數(shù)版: const bool operator#( const 類名 &R ) const

  • ==全局函數(shù)版: const bool operator#( const 類名 &L,const 類名 &R ) ==

5.4 單目運算符重載

種類:

? &、!、-(負號)。。。

表達式:

? #O //#表示運算符 O表示操作數(shù)

  • 操作數(shù):既可以是左值也可以是右值

  • 結(jié)果:右值

定義格式:

  • 成員函數(shù)版: const 類名 operator#( void ) const

  • 全局函數(shù)版: const 類名 operator#( conts 類名 &O)

5.4 單目運算符重載

種類:

? &、!、-(負號)。。。

表達式:

? #O //#表示運算符 O表示操作數(shù)

  • 操作數(shù):既可以是左值也可以是右值

  • 結(jié)果:右值

定義格式:

  • 成員函數(shù)版: const 類名 operator#( void ) const

  • 全局函數(shù)版: const 類名 operator#( conts 類名 &O)

5.5 自增、自減運算符重載

前置自增:++a

表達式:

? #O //#表示運算符 O表示操作數(shù)

  • 操作數(shù):只能是左值

  • 結(jié)果:左值,自身的引用

定義格式:

  • 成員函數(shù)版: 類名 & operator#( )

  • 全局函數(shù)版: 類名 & operator#( 類名 &O )

后置自增:a++

表達式:

? O# //#表示運算符 O表示操作數(shù)

  • 操作數(shù):只能是左值

  • 結(jié)果:右值

定義格式:

  • 成員函數(shù)版: 類名 operator#( int )

  • 全局函數(shù)版: 類名 operator#( 類名 &O , int)

5.6 插入、提取運算符重載

  1. cin和cout的來源
namespace std
{
    extern istream cin;         /// Linked to standard input
    extern ostream cout;        /// Linked to standard output
}
  1. 從這兩個類對象可以看出,cin和cout來自于內(nèi)置對象,想要對<<和>>進行重載時,如果想要實現(xiàn)成員函數(shù)版,則需要多istream和ostream類進行修改,難度較大。

  2. 此時,我們可以使用全局函數(shù)版實現(xiàn)這兩個運算符的重載,將該全局函數(shù)設(shè)置成友元函數(shù)即可

  3. 因為要用到istream和ostream的類對象和自定義類對象,原則上來說需要在兩個類中都要設(shè)置成友元函數(shù)

  4. 但是,在運算符重載函數(shù)中,只會對自定義的類對象訪問私有成員,而不會對istream和ostream的類訪問私有成員

  5. 所以,最終只需要在自定義類中,將全局函數(shù)設(shè)置成友元函數(shù)即可

表達式:

? L#R (L是cin或cout #是<<或者>> R是自定義的類對象)

  • 左操作數(shù):istream和ostream的類對象

  • 右操作數(shù):自定義的類對象

  • 結(jié)果:左操作數(shù)自身的引用

格式:

  • ostream &operator<<(ostream &L, const 類名 &O);

  • istream &operator>>(istream &L, const 類名 &O);

5.6 不能重載的運算符

  1. 成員運算符 .

  2. 成員指針運算符 .*

  3. 條件表達式 ?:

  4. 求字節(jié)運算 sizeof

  5. 作用域限定符 ::

5.7 運算符重載注意事項

  1. 運算符重載只能在已有的運算符基礎(chǔ)上進行重載,不能憑空捏造一個運算符

  2. 運算符重載不能更改運算符的本質(zhì):如不能在加法運算符重載中實現(xiàn)減法

  3. 運算符重載不能改變運算符的優(yōu)先級

  4. 運算符重載不能改變運算符的結(jié)合律

  5. 運算符重載函數(shù)不能設(shè)置默認參數(shù)

? L#R (L是cin或cout #是<<或者>> R是自定義的類對象)

  • 左操作數(shù):istream和ostream的類對象

  • 右操作數(shù):自定義的類對象

  • 結(jié)果:左操作數(shù)自身的引用

格式:

  • ostream &operator<<(ostream &L, const 類名 &O);

  • istream &operator>>(istream &L, const 類名 &O);

5.6 不能重載的運算符

  1. 成員運算符 .

  2. 成員指針運算符 .*

  3. 條件表達式 ?:

  4. 求字節(jié)運算 sizeof

  5. 作用域限定符 ::

5.7 運算符重載注意事項

  1. 運算符重載只能在已有的運算符基礎(chǔ)上進行重載,不能憑空捏造一個運算符

  2. 運算符重載不能更改運算符的本質(zhì):如不能在加法運算符重載中實現(xiàn)減法

  3. 運算符重載不能改變運算符的優(yōu)先級

  4. 運算符重載不能改變運算符的結(jié)合律

  5. 運算符重載函數(shù)不能設(shè)置默認參數(shù)

  6. 成員函數(shù)版的參數(shù)要比全局函數(shù)版的參數(shù)少一個,原因是對象本身就是一個參數(shù)文章來源地址http://www.zghlxwxcb.cn/news/detail-422491.html

到了這里,關(guān)于c++學習(day4)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 前端學習——JS進階 (Day4)

    前端學習——JS進階 (Day4)

    練習 throw 拋異常 try/catch 捕獲錯誤信息 debugger this指向——普通函數(shù) 改變this 節(jié)流 案例 防抖

    2024年02月16日
    瀏覽(18)
  • day4 驅(qū)動開發(fā) c語言學習

    不利用系統(tǒng)提供的register_chrdev,自己實現(xiàn)字符設(shè)備的注冊 底層代碼 led.c 應(yīng)用層代碼 app.c 頭文件 head.h

    2024年02月14日
    瀏覽(18)
  • 【C++】繼承的基本特性(定義,賦值轉(zhuǎn)換,友元,靜態(tài)成員,虛擬繼承,默認成員函數(shù),作用域)

    【C++】繼承的基本特性(定義,賦值轉(zhuǎn)換,友元,靜態(tài)成員,虛擬繼承,默認成員函數(shù),作用域)

    ??博客主頁: 主頁 ??系列專欄: C++ ??感謝大家點贊??收藏?評論?? ??期待與大家一起進步! 它允許程序員在保持原有類特性的基礎(chǔ)上進行擴展,增加功能,這樣產(chǎn)生新的類,稱派生類。 Person是父類,也稱作基類。Student是子類,也稱作派生類 總結(jié): 基類private成員

    2024年02月14日
    瀏覽(22)
  • 【Node.js學習 day4——模塊化】

    【Node.js學習 day4——模塊化】

    什么是模塊化與模塊? 將一個復(fù)雜的程序文件依據(jù)一定規(guī)則(規(guī)范)拆分成多個文件的過程稱之為 模塊化 其中拆分的 每個文件就是一個模塊 ,模塊的內(nèi)部數(shù)據(jù)是私有的,不過模塊可以暴露內(nèi)部數(shù)據(jù)以便其他模塊使用。 什么是模塊化項目? 編碼時是按照模塊一個一個編碼的

    2024年01月16日
    瀏覽(50)
  • 數(shù)據(jù)結(jié)構(gòu)與算法學習(day4)——解決實際問題

    數(shù)據(jù)結(jié)構(gòu)與算法學習(day4)——解決實際問題

    在本章的學習此前,需要復(fù)習前三章的內(nèi)容,每個算法都動手敲一遍解題。寧愿學慢一點,也要對每個算法掌握基本的理解! 前面我們學習了簡化版桶排序、冒泡排序和快速排序三種算法,今天我們來實踐一下前面的三種算法。 本章的學習目標: (1)回顧三個算法的基本原

    2024年02月09日
    瀏覽(27)
  • 數(shù)學建模學習筆記day4——層次化分析

    數(shù)學建模學習筆記day4——層次化分析

    層次分析主要有三大典型應(yīng)用 (1)用于最佳方案的選取 (2)用于評價類問題 (3)用于指標體系的優(yōu)選 層次分析法是根據(jù)問題的性質(zhì)和要達成的目標,將問題分解為不同的組成因素,將因素按不同層次聚集組合,形成一個多層次的分析結(jié)構(gòu)模型,最終問題歸結(jié)為最低層(決

    2024年02月09日
    瀏覽(23)
  • Vue3學習日記 Day4 —— pnpm,Eslint

    Vue3學習日記 Day4 —— pnpm,Eslint

    注:此課程需要有Git的基礎(chǔ)才能學習 1、使用原因 ? ? 1.1、速度快,遠勝過yarn和npm ? ? 1.2、節(jié)省磁盤空間 ? 2、使用方式 ? ? 2.1、安裝方式 ? ? ? ? npm install -g pnpm ? ? 2.2、創(chuàng)建項目 ? ? ? ? pnpm create vue ? ? 1、禁用Prettier插件(如果安裝了) 2、安裝Eslint插件,并配置保存

    2024年04月12日
    瀏覽(16)
  • 初識C語言——詳細入門(系統(tǒng)性學習day4)

    初識C語言——詳細入門(系統(tǒng)性學習day4)

    目錄 前言 一、C語言簡單介紹、特點、基本構(gòu)成 簡單介紹: 特點: 基本構(gòu)成: 二、認識C語言程序 標準格式: 簡單C程序: 三、基本構(gòu)成分類詳細介紹? ? (1) (2)數(shù)據(jù)類型 計算機中常用存儲單位 數(shù)據(jù)類型的取值范圍 打印輸入類型 (3)常量和變量 常量的分類:

    2024年02月08日
    瀏覽(29)
  • C++學習筆記——友元、嵌套類、異常

    C++學習筆記——友元、嵌套類、異常

    目錄 一、友元 一個使用友元的示例代碼 輸出結(jié)果 二、嵌套類 一個使用嵌套類的示例代碼 輸出結(jié)果 三、異常 一個使用異常處理的示例代碼 輸出結(jié)果 四、結(jié)論 五、使用它們的注意事項 上一篇文章鏈接: C++中的繼承和模板是非常強大和靈活的特性,它們可以幫助我們實現(xiàn)代

    2024年02月02日
    瀏覽(75)
  • 【javaweb】學習日記Day4 - Maven 依賴管理 Web入門

    【javaweb】學習日記Day4 - Maven 依賴管理 Web入門

    目錄 一、Maven入門 - 管理和構(gòu)建java項目的工具 1、IDEA如何構(gòu)建Maven項目 2、Maven 坐標 (1)定義 (2)主要組成 3、IDEA如何導入和刪除項目 二、Maven - 依賴管理 1、依賴配置 2、依賴傳遞 (1)查看依賴 ?(2)排除依賴 3、依賴范圍 三、Web 入門 1、Springboot web入門體驗 2、HTTP簡述

    2024年02月11日
    瀏覽(50)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包