• 通过一道简单的累加题,加深对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这个函数即可。

    1. class Sum
    2. {
    3. public:
    4. Sum()
    5. {
    6. _ret+=_i;
    7. ++_i;
    8. }
    9. int GetRet()
    10. {
    11. return _ret;
    12. }
    13. private:
    14. static int _i;
    15. static int _ret;
    16. };
    17. int Sum::_i=1;
    18. int Sum::_ret=0;
    19. class Solution {
    20. public:
    21. int Sum_Solution(int n)
    22. {
    23. Sum a[n];
    24. return Sum().GetRet()-(n+1);
    25. }
    26. };
    1. class Sum
    2. {
    3. public:
    4. Sum()
    5. {
    6. _ret+=_i;
    7. ++_i;
    8. }
    9. int GetRet()
    10. {
    11. return _ret;
    12. }
    13. private:
    14. static int _i;
    15. static int _ret;
    16. };
    17. int Sum::_i=1;
    18. int Sum::_ret=0;
    19. class Solution {
    20. public:
    21. int Sum_Solution(int n)
    22. {
    23. Sum a[n-1];
    24. return Sum().GetRet();
    25. }
    26. };
    1. class Sum
    2. {
    3. public:
    4. Sum()
    5. {
    6. _ret+=_i;
    7. ++_i;
    8. }
    9. static int GetRet()
    10. {
    11. return _ret;
    12. }
    13. private:
    14. static int _i;
    15. static int _ret;
    16. };
    17. int Sum::_i=1;
    18. int Sum::_ret=0;
    19. class Solution
    20. {
    21. public:
    22. int Sum_Solution(int n)
    23. {
    24. Sum a[n];
    25. return Sum::GetRet();
    26. }
    27. };

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

    1. class Solution
    2. {
    3. private:
    4. class Sum
    5. {
    6. public:
    7. Sum()
    8. {
    9. _ret+=_i;
    10. _i++;
    11. }
    12. };
    13. private:
    14. static int _i;
    15. static int _ret;
    16. public:
    17. int Sum_Solution(int n)
    18. {
    19. Sum a[n];//定义一个sum的数组
    20. return _ret;
    21. }
    22. };
    23. int Solution ::_i=1;//初始化i
    24. int Solution ::_ret=0;//初始化ret

  • 相关阅读:
    SonarQube学习笔记三:直接使用sonar-scanner扫描器
    关于AbstractQueuedSynchronizer(JDK1.8)的一点理解.
    JAVA:以递归形式实现Pow函数功能算法(附完整源码)
    扫雷游戏优化详解——c语言实现
    多媒体数据处理实验4:LSH索引
    dockerfile
    重生奇迹MU游戏开店技巧
    Unity 自定义编辑器根据枚举值显示变量
    OR青年学员访谈特辑 | 充分发挥主观能动性 自主探索 提升能力
    vscode 如何配置快速生成 vue3 模板
  • 原文地址:https://blog.csdn.net/weixin_56054625/article/details/126239666