函數語意學(The Sematics of Function)

1、非靜態成員函數轉化為非成員函數

c++ 設計準則之一就是:非靜態成員函數至少和非成員函數有相同的效率。

也就是說下面兩個函數具有相同的效率:

float magnitude(const Point3d * this){...};
float Point3d::magnitude(){...};


float Point3d::magnitude()
{
return sqrt(x * x + y * y + z * z);
}
為例。
magnitude函數被轉化為非成員函數的步驟如下:

1.1 改寫函數原型,在第一個參數的位置安插this指針。
float Point3d::magnitude( Point3d * const this);

如果成員函數是const 則變成

float Point3d::magnitude(const Point3d * const this);
1.2 將對非靜態成員的存取改為經this指針存取:
    return sqrt(this->x * this->x + this->y * this->y + this->z * this->z);
1.3 將成員函數重寫成一個外部函數,并處理函數名:

magnitude() -> *magnitude_7Point3dFv(Point3d const this)

 obj.magnitude(); -> magnitude_7Point3dFv(&bj);
ptr->magnitude(); -> magnitude_7Point3dFv(ptr);
2、 名稱的特殊處理(Name Mangling)
2.1 數據成員名稱的處理

一般情況下,會在成員名稱后加上類名。
例:

class Bar
{
public:int ival; 
};calss Foo : public Bar
{
public:int ival;
};

Foo會被處理成下面這樣

calss Foo
{
public:int ival_3Bar; //父類的成員int ival_3Foo; //Foo的成員
};
2.2 成員函數名稱的處理

因為c++支持函數重載,所以在處理成員函數名稱的時候加上了參數列表。

下面是Point類的定義:

class Point
{
public:
void    x();
float   x(float)
};

下面是處理后的Point類

class Point
{
public:
void    x_5PoitFv();
float   x_5PoitFf(float)
};
3、 虛擬成員函數

加入我們有一個Point類如下:

class Point
{
public:virtual void normalize();
}

那么下面的調用

ptr->normalize();

會被轉化為

(*ptr->vptr[1])->(ptr);
  • vptr表示指向虛函數表的指針。
  • 1是normalize在虛表中的索引值
  • 第二個 ptr 表示this指針
4、靜態成員函數

如果上面Point中normalize函數是靜態函數,則別轉換為一般的非成員函數:

obj.normalize()     ->  normalize_5PointSFv()
ptr->normalize()    ->  normalize_5PointSFv()
4.1、靜態成員函數的特性
  • 它不能夠直接存儲非靜態成員。
  • 他不能聲明為const、virtual 或volatile。
  • 他不需要經由類對象調用
5、指向成員函數的指針

如有Point類如下:

class Point
{
public:
float    get_x();
void     set_x(float)
};

下面定義指向get_x和set_x函數的指針:

float (Point::*f_get_x)()       = &Point::get_x;void (Point::*f_set_x)(float)   = &Point::set_x;

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

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

相關文章

練習9.5 彩票分析

練習 9.14:彩票 創建?個列表或元素,其中包含 10 個數和 5 個字 ?。從這個列表或元組中隨機選擇 4 個數或字?,并打印?條消息, 指出只要彩票上是這 4 個數或字?,就中?獎了。 練習 9.15:彩票分析 可以使…

面試題 05. 替換空格

05. 替換空格 題目描述示例 題解 題目描述 請實現一個函數,把字符串 s 中的每個空格替換成"%20"。 示例 示例1 輸入:s “We are happy.” 輸出:“We%20are%20happy.” 題解 class Solution { public:string replaceSpace(stri…

jQuery 元素選擇器集合

jQuery 提供了一套非常強大的元素選擇器,它們可以以各種方式定位和操作網頁文檔中的元素。 以下是 jQuery 中的一些常用選擇器: 1、基本選擇器 #id:選擇 ID 為 id 的元素。.(類選擇器):選擇具有特定類的…

2.5 OJ 網站的使用與作業全解

目錄 1 OJ 網站如何使用 1.1 注冊賬戶 1.2 登錄賬戶 1.3 做題步驟 2 本節課的 OJ 作業說明 3 章節綜合判斷題 4 課時2作業1 5 課時2作業2 6 課時2作業3 1 OJ 網站如何使用 〇J 是英文 Online Judge 的縮寫,中文翻譯過來是在線判題。當用戶將自己編寫的代碼…

基于XC7VX690T FPGA+ZU15EG SOC的6U VPX總線實時信號處理平臺(支持4路光纖)

6U VPX架構,符合VITA46規范板載高性能FPGA處理器:XC7VX690T-2FFG1927I板載1片高性能MPSOC:XCZU15EG-2FFVB1156I板載1片MCU,進行健康管理、時鐘配置等V7 FPGA外掛2個FMC接口兩片FPGA之間通過高速GTH進行互聯 基于6U VPX總線架構的通…

從零開始做題:神奇的棋盤

題目 打開得到一副adfgvx加密棋盤 觀察txt數據只有1-5,猜測是數字字母坐標轉換,用notepad批量操作一下 解題 AGAXXDAGGVGGVDVADAVXDGADVGDVAADDDDFXAFAFDGDVXXDGGDGGDXDDFDDXVGXADGVDFXVVAADDXDXXADDVGGGXGXXXXGXXGGXGDVVVGGGAGAAAAGAAGGAGDDDAGAGGG…

解釋如單例、工廠、觀察者等常見設計模式在Android開發中的應用。

在Android開發中,設計模式的應用是提升代碼質量、增強可維護性和可擴展性的重要手段。單例模式(Singleton)、工廠模式(Factory)、觀察者模式(Observer)等是其中最為常見且實用的設計模式。下面我…

如何對已經存在的表進行加分區方案分區函數

我參考網上的,寫了2給存儲過程,一個初始創建文分區方案分區函數;一個可以通過作業新增文件組文件件; 但是初始沒有綁定表,網上的都是在創建表是綁定分區方案,但是我的表是已經存在的,怎么綁定 …

Python實現網站IP地址查詢

使用socket庫實現網站的ip地址查詢,以便于使用CC攻擊和DDoS攻擊(鬧著玩的) import socket def get_website_ip(website): try: ip socket.gethostbyname(website) return ip except socket.gaierror: retur…

最小數字游戲(Lc2974)——模擬+優先隊列(小根堆)、排序+交換

你有一個下標從 0 開始、長度為 偶數 的整數數組 nums ,同時還有一個空數組 arr 。Alice 和 Bob 決定玩一個游戲,游戲中每一輪 Alice 和 Bob 都會各自執行一次操作。游戲規則如下: 每一輪,Alice 先從 nums 中移除一個 最小 元素&…

力扣 383贖金信

思路,用unordered_map存儲magazine中字符以及字符出現的次數 遍歷ransomNote中每個字符,如果能在map中找到,則對應value減一,如果字符對應的value小于零,意味著magazine中找不到與ransomNote里這個字符對應的字符&…

翁愷-C語言程序設計-05-3. 求a的連續和

05-3. 求a的連續和 輸入兩個整數a和n,a的范圍是[0,9],n的范圍是[1,8],求數列之和S aaaaaa…aaa…a(n個a)。如a為2、n為8時輸出的是222222…22222222的和。 輸入格式: 輸入在一行中給出兩個整數&#xf…

VUE_TypeError: Cannot convert a BigInt value to a number at Math.pow 解決方法

錯誤信息 TypeError: Cannot convert a BigInt value to a number at Math.pow vue 或 react package.json添加 "browserslist": {"production": ["chrome > 67","edge > 79","firefox > 68","opera >…

實戰演練-2021年電賽國一之三端口DC-DC變換器

文章目錄 前言一、題目二、題目分析1、題目要求解析2、題目方案選定方案一(使用buck-boost電路+雙向DC-DC電路(前端))方案二(使用同步整流Boost升壓電路+雙向DC-DC電路(前端))方案三(使用同步整流Boost升壓…

實時聊天 Vue + Vuex + sockjs-client + stompjs進行websocket連接

實時聊天 知識點WebSocket介紹SockJSSTOMP 開發環境功能實現安裝應用在vuex中創建vue中的引入、監聽、實例化與收發、訂閱消息引入組件實例化與訂閱計算屬性監聽收到消息封裝的發送消息的公共方法發送消息 完整的代碼 知識點 WebSocket介紹 WebSocket 是一種在 Web 應用中實現…

二叉搜索樹大冒險:尋找-插入-刪除

OK,看我們題目就可知道啦,今天要分享學習的一種數據結構就是二叉搜索樹。 內容題目也說了三個大概的,分別是尋找、插入、刪除。 講這個之前呢,那么就先講講這個二叉搜索樹是何方神圣呢? 二叉搜索樹: 又…

【學習筆記】無人機(UAV)在3GPP系統中的增強支持(五)-同時支持無人機和eMBB用戶數據傳輸的用例

引言 本文是3GPP TR 22.829 V17.1.0技術報告,專注于無人機(UAV)在3GPP系統中的增強支持。文章提出了多個無人機應用場景,分析了相應的能力要求,并建議了新的服務級別要求和關鍵性能指標(KPIs)。…

全網最詳細單細胞保姆級分析教程(二) --- 多樣本整合

上一節我們研究了如何對單樣本進行分析,這節我們就著重來研究一下如何對多樣本整合進行研究分析! 1. 導入相關包 library(Seurat) library(tidyverse) library(patchwork)2. 數據準備 # 導入單樣本文件 dir c(~/Desktop/diversity intergration/scRNA_26-0_filtered_featur…

Linux上如何安裝ffmpeg視頻處理軟件

在Linux上安裝ffmpeg需要以下步驟: 更新系統 在開始安裝之前,首先需要更新系統以獲取最新的軟件包列表和版本。在終端中執行以下命令: sudo apt update sudo apt upgrade安裝依賴庫 ffmpeg依賴于一些庫和工具,需要先安裝它們。在…

【香橙派 Orange pi AIpro】| 開發板深入使用體驗

目錄 一. 🦁 寫在前面二. 🦁 愉快的安裝流程2.1 安裝前準備2.2 流程準備2.2.1 燒錄鏡像2.2.2 開機2.2.3 連網2.2.4 SSH遠程連接開發板 2.3 體驗 AI 應用樣例 三. 🦁 寫在最后 一. 🦁 寫在前面 大家好,我是獅子呀&…