![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++对象模型
文章平均质量分 67
It塔塔开
万丈高楼平地起,勿在浮沙筑高台。
展开
-
构造、析构、拷贝(Semantics of Construction,Destruction,and Copy)
如果类没有定义析构函数,那么只有在类内的成员或基类拥有析构函数时,编译器才会合成一个析构出来。如果在构造函数里调用虚函数,那么调用的将是当前类里的那个函数,不会调用派生类里的虚函数。原因是:vptr的设置时间点是在 所有基类构造完之后,用户代码之前。如果T有一个默认构造函数,它会被调用。当我定义一个object如下。原创 2024-07-13 23:23:09 · 231 阅读 · 0 评论 -
函数语意学(The Sematics of Function)
c++ 设计准则之一就是:非静态成员函数至少和非成员函数有相同的效率。因为c++支持函数重载,所以在处理成员函数名称的时候加上了参数列表。一般情况下,会在成员名称后加上类名。如果成员函数是const 则变成。下面是处理后的Point类。Foo会被处理成下面这样。原创 2024-07-13 18:21:03 · 146 阅读 · 0 评论 -
构造函数语意学(The Semantics of Constructors)
和带有虚函数的情况类似。类似的道理,如果一个类没有定义任何构造函数,而他的父类含有默认构造。编译器则在需要的时候给这个类生成一个默认构造,用以调用父类的默认构造。如果一个类存在虚基类,编译器会为生成一张虚基类表用以存放所有的虚基类,会在类中安插一个虚基类表指针指向虚基类表。因为a和b的vptr指向的是同一张虚函数表,所以这里可以直接按位拷贝,不需要生成拷贝构造。如果这个类没有任何构造,编译器则会生成一个默认构造,用于正确设置虚基类表指针。举个例子,下面的程序中,编译器会为Bar生成一个默认构造。原创 2024-07-09 05:11:47 · 500 阅读 · 0 评论