通过一道简单的累加题,加深对C++匿名对象,static静态函数静态变量,构造函数,内部类的理解

求1+2+3+...+n_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=M666https://www.nowcoder.com/practice/7a0da8fc483247ff8800059e12d7caf1?tpId=13&tqId=11200&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking首先拿到这个题可能都会直接想到用循环去相加,但是这题又把循环的方式限制死了,那么我们还有没有更巧妙的方法可以解决这题呢?下面根据C++的一些经典语法来解决这题.

方法一:大致思路:利用构造函数来完成迭代相加的过程

1.首先需要自己重新定义一个Sum的类,自定义好构造函数。并且我们定义的这个类需要注意几点:通过_i这样的static静态变量来完成从1到n的循环,用_ret静态变量的方式来记录和,静态成员变量属于整个类,所以对象生命周期是在整个程序运行期间,在类的成员函数中可以随便访问,静态成员为所有类对象所共享,不属于某个具体的实例,跟全局变量特点类似。静态成员变量必须在类外定义,定义时不添加static关键字。

2.然后需要开辟一个a[n]大小的变长数组,如果编译器不支持变长数组的方式,也可利用new的方式动态开辟

3.这个数组在实例化的时候会调用构造函数,那么我们就可以利用构造函数做文章,也就是在构造函数内部去执行累加的过程,这里就好比把Sum()这个构造函数当成while循环一个道理,此处的Sum()这个函数就好比像是一个while或for循环的关键字一样,而里面的具体执行细节都是一样的。

4.处理好Sum类的细节过后,我们可以采用三种方式去返回和:下面第一种采用的是匿名对象的方式调用GerRet,但是这样的方式需要注意一点就是最后要减掉一个n-1,因为匿名对象多了一次拷贝构造。第二种方法就是取巧只开辟n-1个空间。第三种方式并未采取匿名对象,而是对GetRet这个函数稍作修改,把它直接变为static静态函数即可直接访问。第三种方式又是为什么呢?我们都知道在一个类的外面如果要对类进行访问,应当有两种方式,一种就是类采用public去封装,另一种就是利用static成员函数,静态成员函数的特点是没有this指针,只能访问静态成员变量和成员函数,所以第三种方法只需将GetRet这个函数即可。

class Sum
{
public:
    Sum()
    {
        _ret+=_i;
        ++_i;
    }
    int GetRet()
    {
        return _ret;
    }
private:
    static int _i;
    static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;
class Solution {
public:
    int Sum_Solution(int n) 
    {
        Sum a[n];
        return Sum().GetRet()-(n+1);
    }
};
class Sum
{
public:
    Sum()
    {
        _ret+=_i;
        ++_i;
    }
    int GetRet()
    {
        return _ret;
    }
private:
    static int _i;
    static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;
class Solution {
public:
    int Sum_Solution(int n) 
    {
        Sum a[n-1];
        return Sum().GetRet();
    }
};
class Sum
{
public:
    Sum()
    {
        _ret+=_i;
        ++_i;
    }
    static int GetRet()
    {
        return _ret;
    }
private:
    static int _i;
    static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;
class Solution 
{
public:
    int Sum_Solution(int n) 
    {
        Sum a[n];
        return Sum::GetRet();
    }
};

最后一种方法是采用C++语法提供的内部类,注意:内部类就是外部类的友元类。注意友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。这样的写法就可以不需要使用到static静态函数,不过不是特别好想到.

class Solution 
{
private:
    class Sum
    {
    public: 
        Sum()
        {
            _ret+=_i;
            _i++;
        }
};
private: 
    static int _i;
    static int _ret;
public:
    int Sum_Solution(int n) 
    {
        Sum a[n];//定义一个sum的数组
        return _ret;
    }
};
int Solution ::_i=1;//初始化i
int Solution ::_ret=0;//初始化ret

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~|Bernard|

你的鼓励是我写下去最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值