目录
当构造函数在类的private中类外调不了时,可以使用静态函数调用
1.练习题:带解法限制求1+2+3+...+n
题目
分析
读题发现题目对解法的限制比较严格:不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
如果使用递归,则需要使用if来判断返回条件;如果使用位运算,返回的结果n*(n+1)>>1会用到乘号,也不行
本题可以使用CD25.【C++ Dev】类和对象(16) static成员(上)文章提到的静态成员变量来解决,让构造函数和静态成员变量打配合可以完美解决
Myclass设计
尝试初始化n个对象,显然会调用n次构造函数,以此来进行n次加法
设计框架:
class Myclass
{
public:
Myclass()
{
//操作
}
private:
//填写成员变量
};
n次加法应该遵循此顺序:+1、+2、+3、...、+n
需要用两个静态变量,一个存储累加的和(_ret),一个来控制每次相加的数字(_i)
则_ret初始化为0,_i初始化为1,执行一次构造函数时,_ret+=_i并且_i++
由于Myclass定义在Solution外,如果Sum_Solution()函数要取得_ret的值,在Myclass类中需要定义一个GetRet()函数来取得
class Myclass
{
public:
Myclass()
{
_ret+=_i;
_i++;
}
static int GetRet()//参数无this指针,可以使用Myclass::GetRet()来调用
{
return _ret;
}
private:
static int _i;
static int _ret;
};
int Myclass:: _i=1;
int Myclass::_ret=0;
在Sum_Solution()在需要调用n次构造函数
如果使用while则会违背题意
int Sum_Solution(int n)
{
while(n--)//虽然可以通过,但是题目限定不能用while
{
Myclass obj;
}
return Myclass::GetRet();
}
方法1:变长数组
int Sum_Solution(int n)
{
Myclass obj[n];
return Myclass::GetRet();
}
方法2:new对象
int Sum_Solution(int n)
{
new Myclass[n];//b不用接收返回值
return Myclass::GetRet();
}
完整代码
class Myclass
{
public:
Myclass()
{
_ret+=_i;
_i++;
}
static int GetRet()
{
return _ret;
}
private:
static int _i;
static int _ret;
};
int Myclass:: _i=1;
int Myclass::_ret=0;
class Solution
{
public:
int Sum_Solution(int n)
{
Myclass obj[n]; //或者使用new对象
return Myclass::GetRet();
}
};
提交结果
2.静态成员函数和非静态成员函数的互相调用问题
静态成员函数可以调用非静态成员函数吗?
答:之前在CD25.【C++ Dev】类和对象(16) static成员(上)文章中的特点6提到过:原本的静态成员函数的参数是没有隐藏this指针的,而调用非静态成员函数需要传this指针,因此不可以调用
如果要强行调用非静态成员函数其实也是可以的,不过要手动传指针,通过ptr->nonstaticfunction()来调用
#include <iostream>
using namespace std;
class Myclass
{
public:
static void staticfunction(Myclass* ptr)
{
ptr->nonstaticfunction();
}
void nonstaticfunction()
{
cout << "void nonstaticfunction()" << endl;
}
};
int main()
{
Myclass obj;
obj.staticfunction(&obj);
return 0;
}
运行结果:
非静态成员函数可以调用类的静态成员函数吗?
答:和第一问反过来,可以调用,例如以下代码:
#include <iostream>
using namespace std;
class Myclass2
{
public:
static void staticfunction()
{
cout << "static void staticfunction()" << endl;
}
};
class Myclass1
{
public:
void nonstaticfunction()
{
Myclass2::staticfunction();
}
};
int main()
{
Myclass1 obj1;
obj1.nonstaticfunction();
return 0;
}
运行结果:
3.static函数的优势
当构造函数在类的private中类外调不了时,可以使用静态函数调用
例如在栈上创建对象:
#include <iostream>
using namespace std;
class Myclass
{
public:
static Myclass Getobj()
{
Myclass obj;
return obj;
}
private:
Myclass()
{
cout << "Myclass()" << endl;
}
};
int main()
{
Myclass ret = Myclass::Getobj();
return 0;
}
注意:不能使用非静态成员函数! 非静态成员函数需要隐式传this指针,而有this指针的前提:this指针指向已经创建好的对象
运行结果:
例如在堆上创建对象:
#include <iostream>
using namespace std;
class Myclass
{
public:
static Myclass* Getobj()
{
return new Myclass;
}
private:
Myclass()
{
cout << "Myclass()" << endl;
}
};
int main()
{
Myclass* ret = Myclass::Getobj();
return 0;
}
*注:new会自动调用构造函数,这个特点后面文章再说,这里略过
运行结果: