C++學習筆記(十三)

一、C++對象模型和this指針

1.1 成員變量和成員函數分開存儲

在C++中,類內的成員變量和成員函數分開存儲

只有非靜態成員變量才屬于類的對象

#include <iostream>using namespace std;class a1
{};class a2
{int a;
};class a3
{int a;static int b;
};class a4
{int a;void func(){}
};class a5
{int a;static void func(){}
};void test1()
{	a1 a1;// 空對象占用內存空間為1// C++編譯器會給每個空對象也分配一個字節空間,是為了區分空對象占內存的位置// 每個空對象也應該有一個獨一無二的內存地址cout << "size of t:" << sizeof(a1) << endl;
}void test2()
{a2 a2;// 4,說明非靜態成員變量屬于類的對象cout << "size of t:" << sizeof(a2) << endl; 
}void test3()
{a3 a3;// 4,說明靜態成員變量不屬于類的對象cout << "size of t:" << sizeof(a3) << endl;
}void test4()
{a4 a4;// 4,說明非靜態成員函數不屬于類的對象cout << "size of t:" << sizeof(a4) << endl;
}void test5()
{a5 a5;// 4,說明靜態成員函數不屬于類的對象cout << "size of t:" << sizeof(a5) << endl;
}int main(int argc, char* argv[])
{test1();test2();test3();test4();test5();return 0;
}

1.2 this指針概念

每一個非靜態成員函數只會誕生一份函數實例,也就是說多個同類型的對象會共同一塊代碼,那么問題是:這一塊代碼是如何區分是哪個對象調用自己的呢?

C++通過提供特殊的對象指針,this指針,解決上述問題。this指針指向被調用的成員函數所屬的對象

this指針是隱含每一個非靜態成員函數內的一種指針

this指針不需要定義,直接使用即可

this指針的用途:

? ? ? ? 1. 當形參和成員變量名同名時,可用this指針來區分

#include <iostream>using namespace std;class Person
{
public:Person(int age){// age = age; 報錯this->age = age;}int age;
};void test()
{Person p(23);cout << "p1的年齡:" << p.age << endl;
}int main(int argc, char* argv[])
{test();return 0;
}

? ? ? ? 2. 在類的非靜態成員函數中返回對象本身,可使用return *this

#include <iostream>using namespace std;class Person
{
public:Person(int age){// age = age; 報錯this->age = age;}int age;Person addAge1(Person& p){this->age += p.age;return *this;}Person& addAge2(Person& p){this->age += p.age;return *this;}
};void test()
{Person p1(23);cout << "p1的年齡:" << p1.age << endl;Person p2(20);// addAge1返回的值,p1加完p2返回的是拷貝構造函數創建的新的對象,和自身不同,并沒有在p1上進行累加p1.addAge1(p2).addAge1(p2).addAge1(p2).addAge1(p2);cout << "p1的年齡:" << p1.age << endl;// addAge2返回的引用,p1加完p2,返回p2本身p1.addAge2(p2).addAge2(p2).addAge2(p2).addAge2(p2);cout << "p1的年齡:" << p1.age << endl;
}int main(int argc, char* argv[])
{test();return 0;
}

1.3 空指針訪問成員函數

C++中空指針也是可以調用成員函數的,但是也要注意有沒有用到this指針

如果用到this指針,需要加以判斷保證代碼的健壯性

#include <iostream>using namespace std;class Person
{
public:void showClassName(){cout << "this is Person class" << endl;}void showAge(){// 提高代碼健壯性if (this == NULL){return;}// this指針指向的Person是一個空指針,對象沒有實體,更不用說有age屬性了cout << "age=" << this->age << endl;  // 在屬性的前面都默認加了this}int age;
};void test()
{Person* p = NULL;p->showClassName(); // 可以運行p->showAge(); // 有問題
}int main(int argc, char* argv[])
{test();return 0;
}

1.4?const修飾成員函數

常函數:1. 成員函數加const后我們稱這個函數為常函數

? ? ? ? ? ? ? 2. 常函數內不可以修改成員屬性

? ? ? ? ? ? ? 3. 成員屬性聲明時加關鍵字mutable后,在常函數中依然可以修改

常對象:1. 聲明對象前加const稱該對象為常對象

? ? ? ? ? ? ? 2. 常對象只能調用常函數?

二、友元

生活中家里有客廳(Public),有臥室(Private)

客廳所有來的客人都可以進去,但是你的臥室是私有的,也就是說只有你自己可以進去

但是,還有一些例外,比如你允許你的好朋友進去

在程序里,有些私有屬性也想讓類外特殊的一些函數或者類進行訪問,就需要用到友元技術

友元的目的就是讓一個函數或者類訪問另一個類中的私有成員

友元的關機字為 friend

友元的三種實現:1. 全局函數做友元

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2. 類做友元

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3. 成員函數做友元

2.1 成員函數做友元

#include <iostream>
#include <string>using namespace std;class Building
{// 告訴編譯器,goodfriend是全局函數,是Building類的好朋友,可以訪問類中的私有內容friend void goodfriend(Building* building);public:Building(){this->m_SittingRoom = "客廳";this->m_BedRoom = "臥室";}public:string m_SittingRoom; // 客廳
private:string m_BedRoom; // 臥室
};void goodfriend(Building* building)
{cout << "正在訪問:" << building->m_SittingRoom << endl;cout << "正在訪問:" << building->m_BedRoom << endl;
}int main(int argc, char* argv[])
{Building building;goodfriend(&building);return 0;
}

2.2 類做友元

#include <iostream>
#include <string>using namespace std;class Building
{// 告訴編譯器,goodfriend是Building類的好朋友,可以訪問類中的私有內容friend class goodfriend;public:Building();
public:string m_SittingRoom; // 客廳
private:string m_BedRoom; // 臥室
};
// 類外寫成員函數
Building::Building()
{m_SittingRoom = "客廳";m_BedRoom = "臥室";
}class goodfriend
{
public:Building* building;goodfriend();void visit();
};
// 類外寫成員函數
goodfriend::goodfriend()
{// 創建建筑物對象building = new Building;
}
void goodfriend::visit()
{cout << "正在訪問:" << building->m_SittingRoom << endl;cout << "正在訪問:" << building->m_BedRoom << endl;
}void test()
{goodfriend zz;zz.visit();
}
int main(int argc, char* argv[])
{test();return 0;
}

2.3 成員函數做友元

#include <iostream>
#include <string>using namespace std;class Building;
class GoodFriend
{
public:Building* building;GoodFriend();void visit1(); // 讓visit1函數可以訪問Building中私有屬性void visit2(); // 讓visit2函數不能訪問Building中私有屬性
};class Building
{// 告訴編譯器,goodfriend是Building類的好朋友,可以訪問類中的私有內容friend void GoodFriend::visit1();public:Building();
public:string m_SittingRoom; // 客廳
private:string m_BedRoom; // 臥室
};
// 類外寫成員函數
Building::Building()
{m_SittingRoom = "客廳";m_BedRoom = "臥室";
}// 類外寫成員函數
GoodFriend::GoodFriend()
{// 創建建筑物對象building = new Building;
}
void GoodFriend::visit1()
{cout << "正在訪問:" << building->m_SittingRoom << endl;cout << "正在訪問:" << building->m_BedRoom << endl;
}
void GoodFriend::visit2()
{cout << "正在訪問:" << building->m_SittingRoom << endl;// cout << "正在訪問:" << building->m_BedRoom << endl;
}
void test()
{GoodFriend gf;gf.visit1();gf.visit2();
}
int main(int argc, char* argv[])
{test();return 0;
}

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

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

相關文章

基于ssm端游賬號銷售管理系統論文

摘 要 互聯網發展至今&#xff0c;無論是其理論還是技術都已經成熟&#xff0c;而且它廣泛參與在社會中的方方面面。它讓信息都可以通過網絡傳播&#xff0c;搭配信息管理工具可以很好地為人們提供服務。針對端游賬號銷售信息管理混亂&#xff0c;出錯率高&#xff0c;信息安全…

讓你從此不再懼怕ANR

原文鏈接 讓你從此不再懼怕ANR 這篇文章是基于官方的Diagnose and fix ANRs翻譯而來&#xff0c;但也不是嚴格的翻譯&#xff0c;原文的內容都在&#xff0c;又加上了自己的理解以及自己的經驗&#xff0c;以譯注的形式對原文的作一些補充。 當一個Android應用的UI線程被阻塞時…

[排序篇] 冒泡排序

目錄 一、概念 二、冒泡排序 2.1 冒泡降序(從大到小排序) 2.2 冒泡升序(從小到大排序) 三、冒泡排序應用 總結 一、概念 冒泡排序核心思想&#xff1a;每次比較兩個相鄰的元素&#xff0c;如果它們不符合排序規則&#xff08;升序或降序&#xff09;則把它們交換過來。…

Linux內存管理(十七):percpu 機制(2)——動態分配

源碼基于:Linux5.4 約定: 芯片架構:ARM64內存架構:UMACONFIG_ARM64_VA_BITS:39CONFIG_ARM64_PAGE_SHIFT:12CONFIG_PGTABLE_LEVELS :3關聯博文: percpu機制(1)——框架實現 percpu機制(2)——動態分配 0. 前言 上一篇博文 我們剖析了 percpu 機制的整個框架,包括per…

大致人類應該是短時記憶和利用短時記憶控制利用周圍環境達到長期記憶的吧

這里寫目錄標題 圖代碼代碼解析圖 代碼 import timedef route_llm(route_text):passdef write_to_dask(one_sum, one_text, one_path

小程序嵌套H5

小程序嵌套H5 使用Hbuild x開發H5頁面項目里面使用了js-sdk工具包H5發布完成之后生成URL。新建一個小程序空項目&#xff0c;填寫小程序的appid。本地調試的時候如果報錯無法打開該網頁&#xff0c;那么需要勾選先的不校驗。發布體驗版本需要注意下面的兩個配置點。 使用Hbuild…

中通快遞單號查詢入口,將指定某天簽收的單號篩選出來

批量查詢中通快遞單號的物流信息&#xff0c;將指定某天簽收的單號篩選出來。 所需工具&#xff1a; 一個【快遞批量查詢高手】軟件 中通快遞單號若干 操作步驟&#xff1a; 步驟1&#xff1a;運行【快遞批量查詢高手】軟件&#xff0c;并登錄 步驟2&#xff1a;點擊主界面左…

Spring Boot中JdbcTemplate多數據源配置

作者簡介&#xff1a;大家好&#xff0c;我是擼代碼的羊駝&#xff0c;前阿里巴巴架構師&#xff0c;現某互聯網公司CTO 聯系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我進群&#xff0c;大家一起學習&#xff0c;一起進步&#xff0c;一起對抗…

編譯 Flink代碼

構建環境 JDK1.8以上和Maven 3.3.x可以構建Flink&#xff0c;但是不能正確地遮蓋某些依賴項。Maven 3.2.5會正確創建庫。所以這里使用為了減少問題選擇 Maven3.2.5版本進行構建。要構建單元測試&#xff0c;請使用Java 8以上&#xff0c;以防止使用PowerMock運行器的單元測試失…

云計算核心技術

1.1 云計算的定義 云計算是目前業內的熱點概念&#xff0c;它以開放的標準和服務為基礎&#xff0c;以互聯網為中心&#xff0c;提供安全、快速、便捷的數據存儲和網絡計算服務&#xff0c;讓互聯網這片“云”上的各種計算機共同組成數個龐大的數據中心及計算中心。它可以被看成…

求職智能分析系統

本項目是一個基于Flask輕量級框架的計算機就業數據可視化分析平臺。 采用echarts和ajax等技術進行數據展示和用戶交互。

【電路筆記】-電位器

電位器 文章目錄 電位器1、概述2、電位器類型2.1 旋轉電位器2.2 滑塊電位器2.3 預設和微調電位器2.4 變阻器 3、電位器示例14、電位器作為分壓器5、電位器示例26、變阻器6、滑塊變阻器7、線性或對數電位器8、總結 當連接的軸物理旋轉時&#xff0c;電位計和變阻器的電阻值會發生…

一個簡單的Wireshark和TCP三次握手,為什么能難住阿里6年測試?

之前寫過一篇博客&#xff1a;用 Fiddler 來調試HTTP&#xff0c;HTTPS。 這篇文章介紹另一個好用的抓包工具wireshark&#xff0c; 用來獲取網絡數據封包&#xff0c;包括http,TCP,UDP&#xff0c;等網絡協議包。 記得大學的時候就學習過TCP的三次握手協議&#xff0c;那時候…

Vue中 v-show 和 v-if 有什么區別

Vue中的 v-show 和 v-if 一.v-show 與 v-if 原理分析v-show 原理v-if 原理 二、v-show 與 v-if 的共同點三、v-show 與 v-if 的區別四、v-show 與 v-if 的使用場景使用 v-show 的場景&#xff1a;使用 v-if 的場景&#xff1a; 五、v-show 與 v-if 的優缺點v-show優點&#xff…

kafka rebalance(再均衡)導致的消息積壓分析

起因&#xff1a; 某天&#xff0c;項目組收到大量的kafka消息積壓告警。查看了kafka日志后&#xff0c;發現 kafka不斷地 rebalance(再均衡)。 Rebalance (再均衡)&#xff1a; 分區的所有權從一個消費者轉移到另一個消費者&#xff0c;這樣的行為被稱為Rebalance (再均衡)…

修改汽車的控制系統實現自動駕駛,基于一個開源的汽車駕駛輔助系統實現全自動駕駛

修改汽車的控制系統實現自動駕駛,基于一個開源的汽車駕駛輔助系統實現全自動駕駛。 自動駕駛汽車依靠人工智能、視覺計算、雷達、監控裝置和全球定位系統協同合作,讓電腦可以在沒有任何人類主動的操作下,自動安全地操作機動車輛。 演示視頻: Openpilot :一個開源的汽車駕…

Socks5代理與代理IP的技術創新

隨著全球市場的開放和跨界電商的崛起&#xff0c;企業在出海過程中面臨著復雜多變的網絡環境和地域限制。在這一背景下&#xff0c;Socks5代理和代理IP等技術應運而生&#xff0c;成為助力企業突破網絡壁壘、實現出海目標的重要工具。本文將深入探討Socks5代理和代理IP在跨界電…

OpenSSL 3.x爆出漏洞,如何妥善應對?

10月25日&#xff0c;OpenSSL項目團隊發布了OpenSSL 3.x版中一個關鍵安全漏洞的修復程序。該修復程序已于11月1日正式發布。 由于OpenSSL有著極為廣泛的使用&#xff0c;該公告引起了很大反響。Akamai希望能通過本文幫助相關用戶了解情況&#xff0c;介紹有關檢測和緩解威脅的…

怎么消除視頻中所有的聲音?方法很簡單

當我們想把視頻中去掉聲音&#xff0c;可能有多種原因&#xff0c;也許需要制作一個無聲視頻&#xff0c;或者想在視頻中添加自己的音樂或解說&#xff0c;特別是一些搞笑解說&#xff0c;無論原因是什么&#xff0c;到底要怎么把視頻中所有的聲音都去除呢&#xff1f; 小編給…

計算機畢業設計 基于Web的網上購物系統(pc端仿淘寶系統)的設計與實現 Java實戰項目 附源碼+文檔+視頻講解

博主介紹&#xff1a;?從事軟件開發10年之余&#xff0c;專注于Java技術領域、Python人工智能及數據挖掘、小程序項目開發和Android項目開發等。CSDN、掘金、華為云、InfoQ、阿里云等平臺優質作者? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精…