在学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.data | 不可知数 pb[1] | 不可知数 pb[4] | 不可知数 pb[7] |
derived.data1 | 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:本博文只用于日常备注及学习交流,请勿用于任何商业用途,涉及网摘等资料如有侵犯原作者权利,请联系确保及时更正!