赋值兼容规则:派生类的对象/引用/指针,可以直接赋值给基类对象/引用/指针。
A对象调用son的构造,其中son的构造又调用parent的构造,x等于0,i=0;
A.change(); ---->x=1 i=1; A.modify();----> x=2
B对象调用parent的构造,x=0 i=0;
B.change();--->x=1;
内联函数编译时决议,直接展开。
如果类中有虚函数,对象中会包含一个虚表指针,在多态调用时根据虚表指针去调用函数,是运行时决议。
但内联函数可以写成虚函数,因为内联只是建议。
静态成员函数在编译时决议,虚函数是为了构成多态实在运行时决议的。
C
构造子类对象时,先调用父类的构造函数初始化父类中的成员。
析构子类对象时,先调用父类的析构函数,释放父类成员
虚基类:被虚拟继承的类
抽象类:具有纯虚函数的类
纯虚函数也可以有实现,不一定非是空函数。
第四个对。
const修饰的是p指向的对象,对象内容不能被修改。
p是一个char类型的指针,在64位平台下大小为8字节。
内敛函数在编译时展开,跟宏调用差距不大。
A
场景:用父类指针指向一块子类空间。如果析构函数不定义为虚函数,那就不构成多态。delete(p);时根据指针类型,调用父类析构函数,仅释放了父类成员。子类成员造成了内存泄漏。
A
Play(5);这里调用有参的构造,创建一个临时变量(理应再创建一个临时变量作为返回值返回,但这里编译器会自动优化),然后该临时变量拷贝构造给temp
临时变量析构--> temp-->析构
输出结果:
A::print() B::print() C::print() A::print() B::print() C::print() A::print() A::print() A::print()
print()函数构成多态
以对象(a,b,c)调用,分别调用类(A,B,C)的print();此处为普通调用
以父类指针调用(aa,ab,ac),根据指向的对象调用类(A,B,C)的print();此处为多态调用
以全局函数调用,参数为A类类型,(b、c切片),永远调用A类的print();
编程
跳石板
思路:写一个可以找到约数的函数,然后遍历就好了,到达不了的地方不进入更新逻辑。
#include <iostream>
#include <vector>
using namespace std;
vector<int> Nums(int n)
{
vector<int>res;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
res.push_back(i);
if(i!= n/i)
{
res.push_back(n/i);
}
}
}
return res;
}
int main()
{
int N,M;
cin>>N>>M;
vector<int>dp(M+1,0x3f3f3f3f);
dp[N]=0;
//设计一个函数 返回N的约数
for(int i=N;i<=M;i++)
{
if(dp[i]!=0x3f3f3f3f)
{
vector<int>num=Nums(i);
for(auto& e:num)
{
if(i+e<=M)
dp[i+e]=min(dp[i+e],dp[i]+1);
}
}
}
if(dp[M]==0x3f3f3f3f) cout<<-1<<endl;
else cout<<dp[M]<<endl;
return 0;
}
参数解析
思路:对于 ' 进行特判,处理好什么时候推送数据即可
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//参数解析
int main()
{
string str;
getline(cin, str);
vector<string>res;
string tmp;
bool flag = false;
for (int i = 0; i < str.size(); i++)
{
if (flag && str[i] == '"')
{
flag = false;
}
else if (str[i] == '"')
{
flag = true;
}
else if (str[i] != ' ')
{
tmp.push_back(str[i]);
}
else if (str[i] == ' ' && flag)
{
tmp.push_back(str[i]);
}
else
{
res.push_back(tmp);
tmp = "";
}
}
if (!tmp.empty())
res.push_back(tmp);
cout << res.size() << endl;
for (auto& str : res)
{
cout << str << endl;
}
return 0;
}