今天学习了const修饰成员函数和mutable关键字,还刷了一道关于看似简单的数学题,收获颇丰呢。
首先学习了const修饰成员函数部分,成员函数后放const,那么成员变量在里面就不能被改变,
class Person
{
public:
void ShowPerson() const
{
m_age = 100;
}
int m_age;
};
原因我刚刚检索到,因为在成员函数中存在一个this指针,它是一个不能改变指向的指针,也就是指针常量,而加上const以后,this就变成了常量指针常量,也就是说成员函数中的成员变量被this指着,而this又是常量指针常量,所以就无法改变了。
另外,声明对象前加const称该对象为常对象。
其次我学习了mutable关键字,它就把常函数的限制给冲破了,只要在定义成员函数时,前面加上mutable,这个变量就可以在常函数中被改变了。
class Person
{
public:
void ShowPerson() const
{
m_age = 100;
}
mutable int m_age;
int m_A;
};
void test11()
{
const Person p;
p.m_A = 10;
p.m_age = 100;
}
最后,常对象只能调用常函数,其实很简单,常对象其实就是一个常量,不能被改变,而常函数正好合它的口味,不会改变成员变量,所以常对象只能调用常函数。
然后是那道看起来很简单的数学题,也是小看它了:
这个题的核心考点就是关于负数除法取余数的问题,首先这是答案:
include
using namespace std;
int main()
{
int T;
cin>>T;
while(T--){
long long int A,B;
cin>>A>>B;
long long int r = A%B;
if(r>=0){
cout<<r<<endl;
}else{
if(B<0){
B=-B;
}
cout<<B+r<<endl;
}
}
return 0;
}
负数取余的方法:我通过检索给大家带来另一种理解,被除数和除数异号的除法,C++,java会倾向于让商更大;而python、web还有一些计算器都是会倾向于让商更小,例如7/(-3)的结果有两种:7/(-3)=-3......-2 and 7/(-3)=-2......1,两种不同的结果,前者是python、web还有一些计算器的结果,后者是java和c++的结果。详情见另一位优秀大佬的文章
这里我是先在网上查阅了负数除法取余的相关知识,后来修改了自己的方法,一开始真的严重低估这个题了哈哈,首先,除法运算取余要考虑四种情况:令a,b>0;1.a/b,2.a/-b,3.-a/b,4.-a/-b; 然后这四种情况第一种不用说,直接%就出结果了, 然后第二三种情况呢,异号的两个数做除法运算,C++倾向于商更大的情况,例如:7/(-3)有两种结果:-3......-2和-2......1;C++会选择后者的结果,符合题目要求大于0的条件,然而,-7/3时,也有两个结果-2......-1和-3......2,c++会选择前者的结果,所以为了符合条件,必须让他选择另外一种结果,我发现两种余数的关系是-1+除数=2,所以可以借此进行讨论解决问题; 最后一种情况,都是负数的情况,例如,-7/(-3)可得2......-1或3......2,这里不管C++还是别的什么编程语言,得数都为2......-1,所以为了符合条件,依然借助除数,但此时除数是负数,所以需要取一个相反数,这样就好了。 虽然说起来很复杂,但其实很好理解也很好实现,欢迎交流和吐槽。
这个题:核心考点:数学中的负数除法取余问题 我踩的坑:第一次用int来定义这些量,没有考虑溢出的情况,第二次没有考虑负数的情况,第三次没有考虑被除数和除数都是负数的情况;可以优化的地方:无
今天发现的问题:写代码时的效率和状态很重要,一定要寻找方法来调整,以及合理地调整时间,今天的英语听力和数学都没来得及学,以及前三天遗留的问题还没有解决,今天还有两个关于VS使用方面的问题还没有解决,一定不要忘记。