Q:客戶的需求
1.函數(shù)可以獲得斐波那契數(shù)列每項的值
2.每調(diào)用一次返回一個值
3.函數(shù)可根據(jù)需求重復(fù)使用
成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元樟樹做網(wǎng)站,已為上家服務(wù),為樟樹各地企業(yè)和個人服務(wù),聯(lián)系電話:13518219792
for(int i=0;i<10;i++)
{
cout<
代碼示例
#include
#include
using namespace std;
int fib()
{
static int a0=0;
static int a1=1;
int ret=a1;
a1=a0+a1;
a0=ret;
return ret;
}
int main()
{
for(int i=0; i<10; i++)
{
cout << fib() << endl;
}
cout << endl;
for(int i=0; i<5; i++)
{
cout << fib() << endl;
}
cout << endl;
for(int i=0; i<5; i++)
{
cout << fib() << endl;
}
return 0;
}
輸出的結(jié)果如圖所示
從代碼以及運行結(jié)果我們看到一些存在的問題
1.靜態(tài)局部變量處于函數(shù)內(nèi)部,外界無法改變
2.函數(shù)位全局變量,是唯一的,無法多次獨立使用
3.無法指定某個具體的數(shù)列作為初始值
解決方案:使用函數(shù)對象
1.使用具體的對象取代函數(shù)
2.該類的對象具備函數(shù)調(diào)用的行為
3.構(gòu)造函數(shù)指定具體數(shù)列項的起始位置
4.多個對象相互對立的求解數(shù)列項
函數(shù)的調(diào)用操作符
1.只能通過類的成員函數(shù)重載
2.可以定義不同參數(shù)的多個重載函數(shù)
代碼示例
#include
#include
using namespace std;
class Fib
{
int a0;
int a1;
public:
Fib()
{
a0 = 0;
a1 = 1;
}
Fib(int n)
{
a0 = 0;
a1 = 1;
for(int i=2; i<=n; i++)
{
int t = a1;
a1 = a0 + a1;
a0 = t;
}
}
int operator () ()
{
int ret = a1;
a1 = a0 + a1;
a0 = ret;
return ret;
}
};
int main()
{
Fib fib;
for(int i=0; i<10; i++)
{
cout << fib() << endl;
}
cout << endl;
for(int i=0; i<5; i++)
{
cout << fib() << endl;
}
cout << endl;
Fib fib2(10);
for(int i=0; i<5; i++)
{
cout << fib2() << endl;
}
return 0;
}
運行結(jié)果如圖所示
從多次的運行結(jié)果可以看出,對之前存在的問題進行改正,完成了需求
小結(jié)
1.函數(shù)調(diào)用操作符是可以重載的
2.函數(shù)調(diào)用操作符只能通過類的成員函數(shù)重載
3.函數(shù)調(diào)用操作符可以定義不同參數(shù)的多個重載指針
4.函數(shù)對象用于在工程中取代函數(shù)指針
Q:關(guān)于賦值的疑問
1.編譯器為每個類默認重載了賦值操作符
2.默認的賦值操作符僅完成淺拷貝
3.當(dāng)需要進行深拷貝時必須重載賦值操作符
4.賦值操作符與拷貝構(gòu)造函數(shù)有相同的存在意義
代碼示例
#include
#include
using namespace std;
class Test
{
int* m_pointer;
public:
Test()
{
m_pointer = NULL;
}
Test(int i)
{
m_pointer = new int(i);
}
Test(const Test& obj)
{
m_pointer = new int(*obj.m_pointer);
}
void print()
{
cout << "m_pointer = " << hex << m_pointer << endl;
}
~Test()
{
delete m_pointer;
}
};
int main()
{
Test t1 = 1;
Test t2;
t2 = t1;
t1.print();
t2.print();
return 0;
}
運行結(jié)果如圖所示
分析:在代碼中由于將t1賦值給t2,導(dǎo)致t1與t2指向的是同一個地址,而在使用完之后,對內(nèi)存進行釋放時對同一個地址釋放了兩次,這個操作在計算機內(nèi)部會造成錯誤
Q:關(guān)于string的疑問
下面的代碼輸出是什么?
string s="123456";
const char *p=s.c_str();
cout<
如上所示的代碼想完成的是在字符串123456后面添加abced
可實際的運行結(jié)果如圖所示
分析
小結(jié)
1.在需要進行深拷貝的時候必須重載賦值操作符
2.賦值操作符何拷貝構(gòu)造函數(shù)又同等重要的意義