不適宜復制實參的情況:
1)當需要在函數中修改實參的值時;
2)當需要以大型的對象作為實參時;
3)當沒有辦法實現對象復制時;
使用引用形參返回額外的信息
#include <iostream>
#include <vector>
using namespace std;
//函數說明:找出范圍內特定的值出現的次數,並返回第一次出現的迭代器
vector<int>::const_iterator findVal(vector<int>::const_iterator begin,vector<int>::const_iterator end,int value,vector<int>::size_type &occurs)
{
vector<int>::const_iterator p=end;
occurs=0;
for(;begin!=end;++begin)
if(*begin==value)
{
if(p==end) p=begin;
++occurs;
}
return p;
}
int main()
{
vector<int> iVector;
vector<int>::size_type a;
iVector.push_back(1);
iVector.push_back(2);
iVector.push_back(3);
iVector.push_back(2);
vector<int>::const_iterator iter=findVal(iVector.begin(),iVector.end(),2,a);
cout << a<<*iter<<"Hello world!" << endl;
return 0;
}
如果使用引用形參的唯一目的是避免復制實參,則應該將形參定義為const引用。
應該將不需要修改的引用形參定義為const引用。普通的非const引用形參在使用時不太靈活。這樣的形參既不能用const對象初始化,也不能用字面值或產生右值的表達式實參初始化。
通常函數應該有vector或其他標准庫容器類型的形參。調用含有普通的非引用vector形參的函數將會復制vector的每一個元素。
將數組形參直接定義為指針要比使用數組語法定義要好,若設成數組形參,容易引起誤解,造成越界錯誤。
不需要修改數組形參的元素師,函數應該將形參定義為指向const對象的指針。如:void f(const int *).
千萬不要返回一個局部對象的引用。
求公約數(惠普實習生面試題):
#include <iostream>
#include <math.h>
using namespace std;
int rgcd1(int a,int b);//遞歸求解
int rgcd2(int a,int b);//迭代求解
int main()
{
cout<<rgcd1(9,6)<<endl;
cout<<rgcd2(16,12)<<endl;
cout << "Hello world!" << endl;
return 0;
}
int rgcd1(int a,int b)
{
if(b!=0) return rgcd1(b,a%b);
else return a;
}
int rgcd2(int a,int b)
{
int t;
if(b==0||a==0) return (abs(a-b));
t=a%b;
while(t)
{
a=b;b=t;t=a%b;
}
return b;
}
函數定義時,如果有一個形參具有默認實參,那麼它後面所有的形參都必須有默認實參。
在設計帶有默認實參函數的的時候,要注意排列形參,使最少使用默認實參的形參排列
在最前,最肯能使用默認實參的形參排在最後。
靜態局部對象一旦被創建,在主程序結束前都不會撤銷。可用作計數器。生命周期為整個源程序,但作用域與自動變量相同。
遵守一般的訪問規則。
關於靜態數據成員:對於所有的對象共有一個成員變量的就用static ,提供一個所有對象共有的一個成員變量比“每一個類對象維護一個成員變量” 要更有效。
每個類對象都有自己的拷貝而靜態數據成員對每個類類型只有一個拷貝靜態數據成員,只有一份由該類類型的所有對象共享訪問。同全局對象相比使用靜態數據成員有兩個優勢
1 靜態數據成員沒有進入程序的全局名字空間因此不存在與程序中其他全局名字沖突的可能性
2 可以實現信息隱藏靜態成員可以是private 成員而全局對象不能
關於靜態函數成員:
靜態成員函數:使用static關鍵字聲明的函數成員使靜態的,靜態成員函數同樣也屬於整個類,由同一個類的所有對象共同維護,為這些對象所共享.
靜態成員函數一般只能訪問靜態成員變量,如果要訪問非靜態成員變量的話,只能訪問某一個對象的非靜態成員變量和靜態成員函數。可以傳一個對象的指針,引用等參數給這個靜態成員函數。
在類的定義體外部引用類的static成員時,必須指定成員時哪個類中定義的。static關鍵字只能用於類定義體內部的聲明中,定義不能標示為static。
內聯函數(inline)
將小操作定義為函數的好處:
1)可讀性好2)可維護性高3)可重用
定義為內聯函數可以避免函數調用的開銷
內聯函數應當在頭文件中定義。
類的成員函數既可以在類的定義內也可以在類的定義外,
編譯器會隱式地將在類內定義的成員函數當作內聯函數。
const成員函數在函數原型署名和函數定義中都要增加const限定,指明其為不改變對象的成員函數。
const對象,指針或引用只能用於調用其const成員函數,非const成員函數可能企圖修改常量的數據成員。
重載函數:出現在相同作用域中的兩個函數,具有相同的名字而形參不同,不能僅僅基於不同的返回類型而實現。
僅當形參是引用或指針時,形參是否為const才能影響。
指向函數的指針即函數的入口;例子如下:
#include <iostream>
using namespace std;
int max(int a,int b);
int main()
{
int c;
int (*p)(int,int);
p=max;
c=(*p)(9,6);
cout << c<<"Hello world!" << endl;
return 0;
}
int max(int a,int b)
{
return a>=b?a:b;
}
使用typedef能更直觀地定義,
如typedef char (*PTRFUN)(int);
PTRRFUN pFun;
typedef的功能時定義新的類型,第一句就是定義了一種PTRFUN的類型,並定義這種類型為指向某種函數的指針,這種函數以一個int為參數,並返回char型,第二行使用此新類型定義了指針函數。