C++PRimer
inline
調用函數不但必須拷貝兩個實參保存機器的寄存器程序還必須轉向一個新位置。
將在程序中每個調用點上被內聯地 展開
函數聲明或定義中的函數返回類型前加上關鍵字 inline
把 inline 函數的定義放到頭文件中在每個調用該 inline
函數的文件中包含該頭文件
函數原型
函數聲明由函數返回類型函數名和參數表構成這三個元素被稱為函數聲明 function
declaration 或函數原型 functionprototype
缺省實參
char *screenInit( int height = 24, intwidth = 80,
char background = ' ' );
// 等價于 screenInit(24,80,' ')
cursor = screenInit();
// 等價于 screenInit(66,88, ' ')
cursor = screenInit(66);
指向函數的指針
int gcd( int, int ){
return 44;
}
int (*pf)( int, int );
int main()
{
pf=gcd;
cout <<pf(2,3) << endl;
函數指針的數組
pf=gcd;
extern
externint i;(extern 只聲明不定義,去掉會造成重復定義)
externint i;(可以重復聲明。)
extern int i ;(全局變量為0;extern可加可不加)
inti ;(error,重復定義)
intmain()
{
cout<<i << endl;
extern對于函數,同上。
局部對象
局部變量的生命期局限于所在函數的每次執行期間。
自動對象
為初始化的內置類型局部變量,其初值不確定。
當函數調用結束時,自動對象就會撤銷。
形參也是自動對象。
一個變量如果位于函數的作用域內,但生命期跨越了這個函數的多次調用,這種變量往往很有用。應該將這樣的對象對象定義為static。 static局部對象確保不遲于在程序執行流程第一次經過該對象的定義語句時進行初始化。這種對象一旦被創建,在程序結束前都不會撤銷。
函數調用:調用前先保存寄存器,并在返回時恢復;
auto_ptr
用來釋放數組的 delete 表達式形式如下
delete[] str1;
constint *pci = new const int(1024);
deletepci;
名字空間定義
namespacecplusplus_primer {
class matrix { /* ... */ };
void inverse ( matrix & );
constdouble pi = 3.1416;
}
void cplusplus_primer::inverse ( matrix &m){}
void func( cplusplus_primer::matrix &m )
{cplusplus_primer::inverse(m);}
cplusplus_primer::matrix m;
func(m );
名字空間的定義可以非連續
namespacecplusplus_primer {}
if( cur > ::max ) break;
嵌套域
cplusplus_primer::MatrixLib::matrix
隱藏
隱藏 ::Type
隱藏 MatrixLib::val
未命名的名字空間
namespace {
void swap2( double d1, double d2 ) { /* ... */}
}
swap2(3,4);
未命名名字空間成員名只在特定的文件中可見 在構成程序的其他文件中是不可
見的
// 短別名
namespace mlib2 = cplusplus_primer::MatrixLib;
namespace mlib=mlib2;
// 較易讀
void func( mlib::matrix &m )
{
cout << mlib::pi<< endl;
}
mlib::matrix m22;
func( m22 );
using cplusplus_primer::MatrixLib::matrix;
matrix m22;
func( m22 );
using cplusplus_primer::MatrixLib::matrix;=using namespacecplusplus_primer::MatrixLib;
.
ostream& Operator<< ( ostream&o, const Screen& s ){
cout << s.addToken()<< endl;
}
int addToken( )const ;
這些函數被自動作為 inline 函數處理
把成員函數聲明為 const 以表明它們不修改類對象
只有被聲明為 const 的成員函數才能被一個 const 類對象調用
把一個修改類數據成員的函數聲明為 const 是非法的
構造函數和析構函數不是 const 成員函數 const類對象也可以調用它們
當構造函數執行結束 類對象已經被初始化時 類對象的常量性就
被建立起來了 析構函數一被調用 常量性就消失 所以一個 const 類對象 從構造完成時
刻到析構開始時刻 這段時間內被認為是 const
Account myAcct( "Tinkerbell");
Tinkerbell 被轉換成一個臨時的 string 對象 然后該對象冉被傳遞給一個雙參數的構
造函數 它的第一個參數是 string 類型
對于我們的新 string 類類型不夠用 例如如下代碼將失敗
string new_client( "SteveHall" );
Account new_acct( new_client, 25000 );
因為在從 string 對象到 char*之間沒有隱式轉換 而寫成
成員初始化表跟在構造函數的原型后 由冒號開頭
如果成員是類對象 則初始值變成被傳遞給適當的構造函數的實參 該構造函數然后被應用在成員類對象上
在我們的例子中 name 被傳遞給
應用在_name 上的 string 構造函數 _balance 用參數 opening_bal 初始化
Account( const Account &rhs )
{
_name = rhs._name;
在隱式初始化階段調用了缺省的 string 構造函數 并且在構造函數體內調用了
string 拷貝賦值操作符
成員初始化表:將成員的初始化和賦值分開。
缺省的按成員賦值 default memberwiseassignment 所處理的是 用一個類對象向該類
的另一個對象的賦值操作
利用了一個隱式的拷貝賦值操作符來取代拷貝構造函數
可能會生成一個缺省構造函數 但是它不會為內置或復
合型的數據成員 如指針或數組 提供初始值
拷貝構造函數 inline Account::Account( const Accout&rhs )
用一個類對象初始化該類的另一個對象被稱為缺省按成員初始化
一個類對象向該類的另一個對象作拷貝是通過依次拷貝每個非靜態數據成員來實現的
按成員賦值inline Account&Account::operator=(const Account &rhs )
一般來說 如果缺省的按成員初始化對于一個類不合適 則缺省的按成員賦值也不合適
新聞熱點
疑難解答
圖片精選