求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
当我们学习了static成员,友元函数,和内部类就可以用c++的两种方法解决这个问题:
1、使用静态成员的特性和友元类(也可以不用友元类)
class Sum
{public:
Sum()//构造函数实现1+2+3+ n
{
_ret+=_i;
_i++;
}
static int Getret()//静态成员函数的声明
{
return _ret;
}
static void Init()//静态成员函数的声明
{
_i=1;
_ret=0;
}
private:
static int _i;//静态成员变量的声明
static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;//定义初始化静态成员变量。
class Solution {
public:
int Sum_Solution(int n) {
Sum::Init();//访问静态成员函数。
Sum *arr=new Sum[n];//使用new,构造n个对象,则会调用n次构造函数
return Sum::Getret();//访问静态成员函数。
}
};
使用友元类:
class Sum
{
friend class Solution;//类Solution是类Sum的友元类,则Solution 可以访问Sum的所有成员
public:
Sum()
{
_ret+=_i;
_i++;
}
static int Getret()
{
return _ret;
}
/*static void Init()
{
_i=1;
_ret=0;
}*/
private:
static int _i;
static int _ret;
};
int Sum::_i=1;
int Sum::_ret=0;
class Solution {
public:
int Sum_Solution(int n) {
// Sum::Init();
Sum::_ret=0;//访问Sum的静态成员
Sum::_i=1;
Sum *arr=new Sum[n];
return Sum::Getret();
}
};
我们一般尽量不要使用友元类,这样会破坏它的封装性。
2、使用内部类
class Solution
{
class Sum
{
public:
Sum()
{
_ret+=_i;
_i++;
}
};
public :
int Sum_Solution(int n)
{
_i=1;
_ret=0;
Sum arr[n];//变长数组
return _ret;
}
private:
static int _i;
static int _ret;
};
int Solution::_i=1;
int Solution::_ret=0;
Sum是Solution的内部类,Sum是Solution的友元类,则Sum可以访问Solution的私有成员和静态成员。