C++語法與面向對象特性(2)

一.inline函數

1.inline的基本特性

被inline修飾的函數被稱為內聯函數。inline函數設計的初衷是為了優化宏的功能,編譯器會在編譯階段對inline函數進行展開。然而需要注意的是,inline對于編譯器而言是一種建議,它通常會展開一些簡短的,非遞歸的函數,遇到較為復雜的函數即使有inline修飾編譯器也會忽略展開

2.與宏的不同之處

宏也會在編譯時展開,對比宏,inline有什么優勢?inline修飾的函數可以調試

有了inline修飾的函數,就不需要再考慮宏中復雜的傳參問題了。例如:

#include<iostream>
using namespace std;
// 實現?個ADD宏函數的常?問題
//#define ADD(int a, int b) return a + b;
//#define ADD(a, b) a + b;
//#define ADD(a, b) (a + b)
// 正確的宏實現
#define ADD(a, b) ((a) + (b))
// 為什么不能加分號?
// 為什么要加外?的括號?
// 為什么要加??的括號?
int main()
{
int ret = ADD(1, 2);
cout << ADD(1, 2) << endl;
cout << ADD(1, 2)*5 << endl;
int x = 1, y = 2;
ADD(x & y, x | y); // -> (x&y+x|y)
return 0;
}

3.使用的注意事項

通常將inline函數定義與聲明都放在頭文件中

不建議將inline的聲明與定義分文件寫,會出現鏈接錯誤。因為inline函數展開后會沒有函數地址

// F.h
#include <iostream>
using namespace std;
inline void f(int i);
// F.cpp
#include "F.h"
void f(int i)
{
cout << i << endl;
} /
/ main.cpp
#include "F.h"
int main()
{
// 鏈接錯誤:?法解析的外部符號 "void __cdecl f(int)" (?f@@YAXH@Z)
f(10);
return 0;
}

地址丟失的底層機制

  1. 函數地址的產生條件

    • 普通函數:編譯器生成函數實體,分配唯一地址,符號表記錄強符號。

    • inline函數:

      • 若被展開:無獨立函數實體?→ 無地址。

      • 若未展開:生成弱符號實體,鏈接器可丟棄未使用的定義。

  2. 分文件編寫的致命缺陷

    • 調用方(main.cpp無法看到函數體?→ 編譯器必須生成函數調用指令。

    • 定義方(F.cpp)的inline函數可能無實體?→ 鏈接器找不到地址。

二.nullptr

nullptr的出現是為了解決C語言中NULL的二義性。C語言中的NULL實際為一個宏,如下:

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

C++中的NULL會被定義為常量0,或C中會被定義為無類型指針(void*),這在函數調用時會產生歧義

這里通過重載f()作為例子

#include<iostream>
using namespace std;
void f(int x)
{
cout << "f(int x)" << endl;
}void f(int* ptr)
{
cout << "f(int* ptr)" << endl;
}

在調用f()時傳入f(NULL)會出現什么情況?

顯然這里的調用結果與預期不符。

那么嘗試將NULL強轉為int*會出現什么情況?

因此我們使用nullptr來規避這樣的情況

nullptr是一種特殊類型的字面量,它可以隱式轉換為各種類型的指針類型,而無法被轉換為整型

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

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

相關文章

Linux中grep命令

Linux 中的 grep 用法詳解grep 是 Linux 中強大的文本搜索工具&#xff0c;用于在文件或輸入流中查找匹配指定模式的行。其基本語法為&#xff1a;grep [選項] "模式" [文件]核心功能基礎搜索在文件中查找包含特定字符串的行&#xff1a;grep "error" log.…

【遙感圖像入門】遙感中的“景”是什么意思?

在遙感成像中,“3景城市影像”和“5景城市影像”中的“景”是遙感數據的基本單位,通常指一次成像過程中獲取的獨立遙感影像塊。這一概念的具體含義需結合技術背景和應用場景理解: 一、“景”的技術定義 單次成像的獨立覆蓋區域 遙感平臺(如衛星、飛機)在特定時間和位置對…

Pytorch-07 如何快速把已經有的視覺模型權重扒拉過來為己所用

下載&#xff0c;保存&#xff0c;加載&#xff0c;使用模型權重 在這一節里面我們會過一遍對模型權重的常用操作&#xff0c;比如&#xff1a; 如何下載常用模型的預訓練權重如何下載常用模型的無訓練權重&#xff08;只下載網絡結構&#xff09;如何加載模型權重如何保存權…

C語言零基礎第9講:指針基礎

目錄 1.內存和地址 2.指針變量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指針變量 2.3 解引用操作符&#xff08;*&#xff09; 2.4 指針變量的大小 3.指針變量類型的意義 3.1 指針的解引用 3.2 指針 - 整數 3.3 void*指針 4.指針運算 4.1 指針…

013 HTTP篇

3.1 HTTP常見面試題 1、HTTP基本概念&#xff1a; 超文本傳輸協議&#xff1a;在計算機世界里專門在「兩點」之間「傳輸」文字、圖片、音頻、視頻等「超文本」數據的「約定和規范」HTTP常見的狀態碼 [[Pasted image 20250705140705.png]]HTTP常見字段 Host 字段&#xff1a;客戶…

每日面試題20:spring和spring boot的區別

我曾經寫過一道面試題&#xff0c;題目是為什么springboot項目可以直接打包給別人運行&#xff1f;其實這涉及到的就是springboot的特點。今天來簡單了解一下springboot和spring的區別&#xff0c; Spring 與 Spring Boot&#xff1a;從“全能框架”到“開箱即用”的進化之路 …

ClickHouse數據遷移

ClickHouse實例是阿里云上的云實例&#xff0c;想同步數據到本地&#xff0c;本地部署有ClickHouse實例&#xff0c;下面為單庫單表 源實例&#xff1a;阿里云cc-gs5xxxxxxx.public.clickhouse.ads.aliyuncs.com:8123 目標實例&#xff1a;本地172.16.22.10:8123 1、目標實例建…

sqli-labs-master/Less-41~Less-50

Less-41這一關還是用堆疊注入&#xff0c;這關數字型不需要閉合了。用堆疊的話&#xff0c;我們就不爆信息了。我們直接用堆疊&#xff0c;往進去寫一條數據?id-1 union select 1,2,3;insert into users (id,username,password) values(666,zk,180)--看一下插進去了沒?id-1 u…

Tiger任務管理系統-10

十是個很好美好的數字&#xff0c;十全十美&#xff0c;確實沒讓人失望&#xff0c;收獲還是很大的。 溫習了前端知識&#xff0c;鞏固了jQuery&#xff0c;thymeleaf等被忽視的框架&#xff0c;意外將之前的所學所用的知識都連起來了&#xff0c;感覺有點像打通了任督二脈一樣…

ora-01658 無法為表空間 users中的段創建initial區

ora-01658 無法為表空間 users中的段創建initial區 參考1 參考2 參考3 參考4 給用戶新增表空間 alter tablespace system add datafile D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM03.DBF size 5G autoextend on next 10M;設置表空間文件自動擴展 ALTER DATABASE DATAFILE /…

lodash的替代品es-toolkit詳解

一、es-toolkit簡介 es-toolkit 是一款先進的高性能 JavaScript 實用程序庫,體積小巧,并支持強類型注釋,典型特征包括: 提供各種日常實用函數并采用現代實現,例如: debounce、delay、chunk、sum 和 pick 等 設計充分考慮了性能,在現代 JavaScript 環境中實現了 2-3 倍…

【原創】基于gemini-2.5-flash-preview-05-20多模態模型實現短視頻的自動化二創

畫面和解說保持一致&#xff0c;這個模型就是NB[16:57:37] [*] 正在從視頻中提取幀和時長 (頻率: 1.0 幀/秒)... [16:57:55] [] 提取完成。視頻時長: 83.40秒, 提取了 84 幀。 [16:57:55] [*] 使用AI供應商: gemini [16:57:55] [*] 正在進行視覺分析... [16:57:55] L-> 正…

數倉架構 數據表建模

數倉架構 主要用來描述 數據加工的實時鏈路 和 離線鏈路之間的關系,即 流批 關系; lamda 架構, 是兩條路, 實時計算式的, 維護數據的實時性。然后每天經過批計算后, 覆蓋實時的計算結果。 保證數據準確性。 kappa架構, 即流批一體了 數據建模 星型模型是數據倉庫中最…

vscode調試python腳本時無法進入函數內部的解決方法

只需在launch.json配置文件中添加“justMyCode”:false.

Python day37

浙大疏錦行 python day37. 內容&#xff1a; 保存模型只需要保存模型的參數即可&#xff0c;使用的時候直接構建模型再導入參數即可 # 保存模型參數 torch.save(model.state_dict(), "model_weights.pth")# 加載參數&#xff08;需先定義模型結構&#xff09; mod…

ORACLE進階操作

1 事務 事務的任務便是使數據庫從一種狀態變換成為另一種狀態&#xff0c;這不同于文件系統&#xff0c;它是數據庫所特用的。 所有的數據庫中&#xff0c;事務只針對DML&#xff08;增刪改)&#xff0c;不針對select select只能查看其他事務提交或回滾的數據&#xff0c;不能查…

Modbus 的一些理解

疑問&#xff1a;&#xff08;使用的是Modbustcp&#xff09;我在 Modbus slave 上面設置了slave地址為1&#xff0c;位置為40001的位置的值為1&#xff0c;40001這個位置上面的值是怎么存儲的&#xff0c;存儲在哪里的&#xff1f;他們是怎么進行交互的&#xff1f;在Modbus協…

【運動控制框架】WPF運動控制框架源碼,可用于激光切割機,雕刻機,分板機,點膠機,插件機等設備,開箱即用

WPF運動控制框架源碼&#xff0c;可用于激光切割機&#xff0c;雕刻機&#xff0c;分板機&#xff0c;點膠機&#xff0c;插件機等設備&#xff0c;考慮到各運動控制硬件不同&#xff0c;視覺應用功能&#xff08;應用視覺軟件&#xff09;也不同&#xff0c;所以只開發各路徑編…

RabbitMQ-日常運維命令

作者介紹&#xff1a;簡歷上沒有一個精通的運維工程師。請點擊上方的藍色《運維小路》關注我&#xff0c;下面的思維導圖也是預計更新的內容和當前進度(不定時更新)。中間件&#xff0c;我給它的定義就是為了實現某系業務功能依賴的軟件&#xff0c;包括如下部分:Web服務器代理…

【Linux基礎知識系列】第九十篇 - 使用awk進行文本處理

在Linux系統中&#xff0c;文本處理是一個常見的任務&#xff0c;尤其是在處理日志文件、配置文件和數據文件時。awk是一個功能強大的文本處理工具&#xff0c;廣泛用于數據提取、分析和格式化。它不僅可以處理簡單的文本文件&#xff0c;還可以處理復雜的結構化數據&#xff0…