189 8069 5689

C++--函数对象的分析经典问题

一.函数对象的分析

Q:客户的需求
1.函数可以获得斐波那契数列每项的值
2.每调用一次返回一个值
3.函数可根据需求重复使用

成都创新互联公司于2013年创立,是专业互联网技术服务公司,拥有项目成都网站建设、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元樟树做网站,已为上家服务,为樟树各地企业和个人服务,联系电话: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;
}

输出的结果如图所示
C++--函数对象的分析  经典问题
从代码以及运行结果我们看到一些存在的问题
1.静态局部变量处于函数内部,外界无法改变
2.函数位全局变量,是唯一的,无法多次独立使用
3.无法指定某个具体的数列作为初始值

解决方案:使用函数对象
1.使用具体的对象取代函数
2.该类的对象具备函数调用的行为
3.构造函数指定具体数列项的起始位置
4.多个对象相互对立的求解数列项
函数的调用操作符C++--函数对象的分析  经典问题
1.只能通过类的成员函数重载
2.可以定义不同参数的多个重载函数
代码示例

#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;
}

运行结果如图所示
C++--函数对象的分析  经典问题
从多次的运行结果可以看出,对之前存在的问题进行改正,完成了需求
小结
1.函数调用操作符C++--函数对象的分析  经典问题是可以重载的
2.函数调用操作符只能通过类的成员函数重载
3.函数调用操作符可以定义不同参数的多个重载指针
4.函数对象用于在工程中取代函数指针

二.经典问题分析

Q:关于赋值的疑问
1.编译器为每个类默认重载了赋值操作符
2.默认的赋值操作符仅完成浅拷贝
3.当需要进行深拷贝时必须重载赋值操作符
4.赋值操作符与拷贝构造函数有相同的存在意义
代码示例

#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;
}

运行结果如图所示
C++--函数对象的分析  经典问题
分析:在代码中由于将t1赋值给t2,导致t1与t2指向的是同一个地址,而在使用完之后,对内存进行释放时对同一个地址释放了两次,这个操作在计算机内部会造成错误
C++--函数对象的分析  经典问题
Q:关于string的疑问
下面的代码输出是什么?

string  s="123456";
const char *p=s.c_str();
cout<

如上所示的代码想完成的是在字符串123456后面添加abced
可实际的运行结果如图所示
C++--函数对象的分析  经典问题
分析
C++--函数对象的分析  经典问题
小结
1.在需要进行深拷贝的时候必须重载赋值操作符
2.赋值操作符何拷贝构造函数又同等重要的意义


当前标题:C++--函数对象的分析经典问题
当前网址:http://cdxtjz.cn/article/gsphci.html

联系我们

您好HELLO!
感谢您来到成都网站建设公司,若您有合作意向,请您为我们留言或使用以下方式联系我们, 我们将尽快给你回复,并为您提供真诚的设计服务,谢谢。
  • 电话:028- 86922220 18980695689
  • 商务合作邮箱:631063699@qq.com
  • 合作QQ: 532337155
  • 成都网站设计地址:成都市青羊区锣锅巷31号五金站写字楼6楼

小谭建站工作室

成都小谭网站建设公司拥有多年以上互联网从业经验的团队,始终保持务实的风格,以"帮助客户成功"为已任,专注于提供对客户有价值的服务。 我们已为众企业及上市公司提供专业的网站建设服务。我们不只是一家网站建设的网络公司;我们对营销、技术、管理都有自己独特见解,小谭建站采取“创意+综合+营销”一体化的方式为您提供更专业的服务!

小谭观点

相对传统的成都网站建设公司而言,小谭是互联网中的网站品牌策划,我们精于企业品牌与互联网相结合的整体战略服务。
我们始终认为,网站必须注入企业基因,真正使网站成为企业vi的一部分,让整个网站品牌策划体系变的深入而持久。