题目:求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.定义一个指向基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象。通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。