基礎復習
- 1.const引用為什么能引用臨時對象
- 2.內聯函數的額外作用
- 3. nullptr
1.const引用為什么能引用臨時對象
臨時對象(Temporary Object)是在表達式求值過程中隱式創建的對象,例如:
函數返回非引用類型的值
類型轉換(如double d = 10 + 5.5;中的中間結果)
初始化const引用或右值引用
const引用將臨時對象的生命周期延長至引用的生命周期結束
2.內聯函數的額外作用
類內成員函數默認內聯的特殊性?
類內直接定義的成員函數(隱式內聯)?除了核心優化作用,還因以下必要性:
??(1) 解決頭文件包含的重復定義問題?
?背景?:類定義通常放在頭文件中,若成員函數在類內實現且未內聯,多個源文件包含該頭文件時,會導致函數重復定義(違反ODR規則)。
?隱式內聯的作用?:通過內聯聲明,允許多個編譯單元包含同一函數定義,避免鏈接錯誤。
3. nullptr
NULL實際是?個宏,在傳統的C頭?件(stddef.h)中,可以看到如下代碼:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
? C++中NULL可能被定義為字?常量0,或者C中被定義為?類型指針(void*)的常量。不論采取何種定義,在使?空值的指針時,都不可避免的會遇到?些?煩,(由于C++存在函數重載)本想通過f(NULL)調?指針版本的f(int*)函數,但是由于NULL被定義成0,調?了f(int x),因此與程序的初衷相悖。f((void*)NULL)只能調用f(void*);
? C++11中引?nullptr,nullptr是?個特殊的關鍵字,nullptr是?種特殊類型的字?量,它可以轉換
成任意其他類型的指針類型。使?nullptr定義空指針可以避免類型轉換的問題,因為nullptr只能被
隱式地轉換為指針類型,?不能被轉換為整數類型。
void f(int x)
{cout << "f(int x)" << endl;return;
}
void f(int*x)
{cout << "f(int*x)" << endl;return;
}
int main()
{f(0);f(NULL);f(nullptr);return 0;
}