您好,登錄后才能下訂單哦!
Q:客戶的需求
1.函數可以獲得斐波那契數列每項的值
2.每調用一次返回一個值
3.函數可根據需求重復使用
for(int i=0;i<10;i++)
{
cout<<fib()<<endl;
}
代碼示例
#include <iostream>
#include <string>
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;
}
輸出的結果如圖所示
從代碼以及運行結果我們看到一些存在的問題
1.靜態局部變量處于函數內部,外界無法改變
2.函數位全局變量,是唯一的,無法多次獨立使用
3.無法指定某個具體的數列作為初始值
解決方案:使用函數對象
1.使用具體的對象取代函數
2.該類的對象具備函數調用的行為
3.構造函數指定具體數列項的起始位置
4.多個對象相互對立的求解數列項
函數的調用操作符
1.只能通過類的成員函數重載
2.可以定義不同參數的多個重載函數
代碼示例
#include <iostream>
#include <string>
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;
}
運行結果如圖所示
從多次的運行結果可以看出,對之前存在的問題進行改正,完成了需求
小結
1.函數調用操作符是可以重載的
2.函數調用操作符只能通過類的成員函數重載
3.函數調用操作符可以定義不同參數的多個重載指針
4.函數對象用于在工程中取代函數指針
Q:關于賦值的疑問
1.編譯器為每個類默認重載了賦值操作符
2.默認的賦值操作符僅完成淺拷貝
3.當需要進行深拷貝時必須重載賦值操作符
4.賦值操作符與拷貝構造函數有相同的存在意義
代碼示例
#include <iostream>
#include <string>
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;
}
運行結果如圖所示
分析:在代碼中由于將t1賦值給t2,導致t1與t2指向的是同一個地址,而在使用完之后,對內存進行釋放時對同一個地址釋放了兩次,這個操作在計算機內部會造成錯誤
Q:關于string的疑問
下面的代碼輸出是什么?
string s="123456";
const char *p=s.c_str();
cout<<p<<endl;
s.append("abced");
cout<<p<<endl;
如上所示的代碼想完成的是在字符串123456后面添加abced
可實際的運行結果如圖所示
分析
小結
1.在需要進行深拷貝的時候必須重載賦值操作符
2.賦值操作符何拷貝構造函數又同等重要的意義
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。