做题的时候发现了这道题。苦苦深思不得其解。在网上看到答案被其神奇之处震惊,所以特此研究并且详解。
方法一:利用构造函数和静态数据成员
此方法主要实在类中添加构造函数,及一些相关静态函数。
上图:
方法一:
class Add
{
public:
Add()
{
++num;
sum += num;
}
//重置,将num与sum清0
//这一步很重要,如果想要调两次构造函数,则这个方法必须要用上
static void Reset()
{
num = 0;
sum = 0;
}
static int GetSum()
{
return sum;
}
private:
static int num;
static int sum;
};
int Add::num = 0;
int Add::sum = 0;
int add1(int num)
{
Add::Reset();
Add *a = new Add[num];
delete[]a;
a = 0;
return Add::GetSum();
}
方法二:利用虚函数
思路:利用虚函数的调用性质去解决问题。
class A;
A* Array[2];
class A
{
public:
virtual int Sum(int num)
{
return 0;
}
};
class B:public A
{
public:
virtual int Sum(int num)
{
return Array[!!num]->Sum(num - 1) + num;
}
};
int add1(int num)
{
A a;
B b;
Array[0] = &a;
Array[1] = &b;
int value = Array[1]->Sum(num);
return value;
}
方法三:用函数指针实现
//这里大体思想与虚函数差不多
typedef int(*fun)(int);//声明一个函数指针
int add1(int num)
{
return 0;
}
int add2(int num)
{
//fun是一个指针,定义类型为fun的数组,把数组传给函数指针的fun
fun f[2] = { add1, add2 };
//这里同样的类似于递归,递归的出口是add1.
//开始都是调用f[add2](num-1),直到num为0,调用add1.
return num + f[!!num](num - 1);
}
方法四:利用&&的短路特性
方法二,方法三,以及方法四其实都是用到了递归类似的思想。
我们用这种方法详细讲一下过程。
int add(int num, int &sum)
{
//这里每次num都会减一,一直到num=0的时候停止。此时sum=0,num=0。并且开始逐层返回sum+=num,实现累加。
num && add(num - 1, sum);
return (sum += num);
}
int main()
{
int num = 2;
int sum = 0;
cout << add(num,sum) << endl;
system("pause");
return 0;
}