构造函数、虚函数方法求1+2+3+...+n

题目:求1+2+…十n,要求不能使用乘除法、for、while、if、 else.switch,case等关键字及条件判断语句(A?B:C)

解法1:构造函数求解,创建N个该类型的实例,把累加放在构造函数里做。

class Temp {
private:
    static unsigned int N;
    static unsigned int Sum;
public:
    Temp(){ ++N; Sum += N;}
    static void Reset(){ N = 0; Sum = 0;}
    static unsigned int Getsum(){ return Sum; }
};

unsigned int Temp::N = 0;
unsigned int Temp::Sum = 0;

unsigned int sum_solution1(unsigned int n)
{
    Temp:: Reset () ;
    Temp *a =new Temp[n];//每实例化一个Temp,N自加一次,Sum求一次和
    delete [ ]a;
    a = NULL;
    return Temp::Getsum();
}

解法2:虚函数求解,定义两个函数,一个函数充当递归函数的角色,另一个函数做递归的终止判断。做递归终止的判断时,可对n进行两次非运算。即当n=0时,即可判断递归终止。

class A;
A*Array[2];

class A {
public:
    virtual unsigned int sum (unsigned int n) {
        return 0;
    }
};

class B:public A
{
    public:
    virtual unsigned int sum (unsigned int n) {
        return Array[!!n]->sum(n-1) + n;//累加
    }
};

int sum_solution2 (int n)
{
    A a;
    B b;
    Array[0]= &a ;
    Array[1]= &b;
    int value = Array[1]->sum (n);
    return value;
}

构造函数知识点补充:

1.构造函数是一种特殊的成员函数,它的名字和类名相同,没有返回值,不需要用户调用(用户也不能调用),而是在创建对象时自动执行。构造函数的作用是在创建对象时进行初始化工作,最常见的就是对成员变量赋值。

2.一旦在类中定义了构造函数,那么创建对象时一定会被执行;如果构造函数有参数,创建对象时就要传参。

3.构造函数不允许有返回值也不能声明为void

4.如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行任何操作。

5.构造函数允许重载,但只有一个被执行

6.不带参数的构造函数使该类的每一个对象都得到相同的初始值。带参数的构造函数,在调用不同对象的构造函数时,将不同的数据传给构造函数,以实现不同的初始化。如:Box::Box(int h,int w,int len)

7.参数初始化表对数据成员初始化

#include <iostream>
using namespace std;
class Box
{
public:
    Box( ); //声明一个无参的构造函数
    //声明一个有参的构造函数,用参数的初始化表对数据成员初始化
    Box(int h,int w,int len):height(h),width(w),length(len){ }
    int volume( );
private :
    int height;
    int width;
    int length;
};

Box::Box( ) //定义一个无参的构造函数
{
    height=10; width=10; length=10;
}

int Box::volume( ){
    return (height*width*length);
}
int main( )
{
    Box box1; //建立对象 box1,不指定实参
    cout<<"The volume of box1 is "<<box1.volume( )<<endl;
    Box box2(15,30,25); //建立对象 box2,指定 3 个实参
    cout<<"The volume of box2 is "<<box2.volume( )<<endl;
    return 0;
}

析构函数知识点补充:

1.析构函数也是一种特殊的成员函数,没有返回值,不需要用户调用,而是在销毁对象时自动执行。与构造函数不同的是,析构函数的名字是在类名前面加一个”~“符号

2.析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,那么编译器会自动生成。

3.析构函数在对象被销毁前执行;要知道析构函数什么时候被调用,就要先知道对象什么时候被销毁。

4.三个对象入栈的顺序依次是 stu1、stu2、stu3,出栈(销毁)的顺序依次是stu3、stu2、stu1,它们对应的析构函数的执行顺序也就一目了然了。

虚函数知识点补充:

1.在基类用 virtual 声明成员函数为虚函数。

2.在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。

3.定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值