在学C++,好像准程序猿都有在CSDN做笔记的习惯,所以我也加入这个队列吧!
记录下学C++的坑。
如发现错误希望能及时提醒,共同进步。
先贴代码吧
例一
#include <iostream>
#include <complex> //复数类
using namespace std;
class Base
{
public:
Base() {cout<<"Base-ctor"<<endl;}
~Base() {cout<<"Base-dtor"<<endl;}
virtual void f(int){cout<<"Base::f(int)"<<endl;}//虚成员函数,由于没有真实用到,可以只写类型
virtual void f(double){cout<<"Base::f(double)"<<endl;}//两个f()函数由于参数类型不同因此构成函数重载
virtual void g(int i=10){cout<<"Base::g()"<<i<<endl;}
};
class Derived : public Base
{
public:
Derived() {cout<<"Derived-ctor" <<endl;}
~Derived(){cout<<"Derived-dtor"<<endl;}
void f(complex<double>) {
cout<<"Derived::f(complex)"<<endl;
}
void g(int i=20){
cout<<"Derived::g()"<<i<<endl;
}
};
int main()
{
cout<<sizeof(Base)<<endl; //c++类的大小只与数据成员大小及虚拟指针大小有关
cout<<sizeof(Derived)<<endl;
Base b;
Derived d;
Base *pb=new Derived;
b.f(1.0);
d.f(1.0);
pb->f(1.0);
b.g();
d.g();
pb->g();//基类中g(int i=10)的初始化是在编译时执行的,但由于运行时派生类中的g将基类的g函数覆盖了,因此输出为Derived::g()10;
delete pb;
return 0;
}
结果
4
4
Base-ctor
Base-ctor
Derived-ctor
Base-ctor
Derived-ctor
Base::f(double)
Derived::f(complex)
Base::f(double)
Base::g()10
Derived::g()20
Derived::g()10
Base-dtor
Derived-dtor
Base-dtor
Base-dtor
例二
#include <iostream>
using namespace std;
class Base
{
public:
Base():data(count)
{
cout<<"Base-ctor"<<endl;
++count;
}
~Base()
{
cout<<"Base-dtor"<<endl;
--count;
}
static int count;
int data;
};
int Base::count;
class Derived : public Base
{
public:
Derived():data(count),data1(data)
{
cout<<"Derived-ctor"<<endl;
++count;
}
~Derived()
{
cout<<"Derived-dtor"<<endl;
--count;
}
static int count;
int data1;
int data;
};
int Derived::count=10;
int main()
{
cout<<sizeof(Base)<<endl;
cout<<sizeof(Derived)<<endl;
Base* pb = new Derived[3];
cout<<pb[2].data<<endl;
cout<<((static_cast<Derived*>(pb))+2)->data1<<endl;
delete[] pb;
cout<<Base::count<<endl;
cout<<Derived::count<<endl;
return 0;
}
结果
4
12
Base-ctor
Derived-ctor
Base-ctor
Derived-ctor
Base-ctor
Derived-ctor
10
1702130553
Base-dtor
Base-dtor
Base-dtor
0
13
下面这句代码是关于地址分配的
Base* pb = new Derived[3];
Derived | [0] | [1] | [2] |
Base.data | 0 pb[0] | 1 pb[3] | 2 pb[6] |
Derived.data1 | 不可知数 pb[1] | 不可知数 pb[4] | 不可知数 pb[7] |
derived.data | 10 pb[2] | 11 pb[5] | 12 pb[8] |
上表为pb指针的对应地址的数据,直接访问时pb指针只能访问Base.data,因为pb的类型为Base
C++类的大小参考博文https://www.cnblogs.com/sz-leez/p/7119232.html
ps:本博文只用于日常备注及学习交流,请勿用于任何商业用途,涉及网摘等资料如有侵犯原作者权利,请联系确保及时更正!