【C++】构造函数不能为哪些情况

本文探讨了C++中构造函数不能被const或static修饰的原因,以及构造函数不能为虚函数的逻辑。同时,解释了虚函数表的归属和对象内存布局中的vptr,指出虚函数表属于类且所有对象共享,而每个对象有自己的vptr指向该表。
摘要由CSDN通过智能技术生成

构造函数不能为哪些情况

1、构造函数不能用const修饰

const修饰的其实是this指针,下面我们看一下this指针的类型:

  • 普通成员函数:T* const------>this指针的指向不能被改变
  • const成员函数:const T* const ----->this指针的指向不能被改变,this指向的内 容也不能被修改

构造函数功能就是初始化变量,需要在构造函数体中进行赋值,就需要更改其中内容,所以不能为const修饰。

2、构造函数不能是静态成员函数,也就是不能用static修饰

静态成员函数只能操作静态成员变量,如果构造函数可以被static修饰,那么构造函数就不能对非静态成员函数进行初始化了。
静态成员函数是属于整个类的,不是属于对象的,是所有对象共享的资源。
静态成员函数没有this指针,不能通过this指针来进行对象的调用。

3、构造函数不能为虚函数

  • 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。无法确定。
  • 虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初始化,将无法进行。

虚函数表属于谁

虚指针(vptr):每个含有虚方法(虚函数)对象里有虚表指针,指向虚表。

虚函数表:虚函数表是顺序存放虚函数地址的,虚表是顺序表,表里存放了虚函数的地址。

C++的编译器应该是保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能——如果有多层继承或是多重继承的情况下)。 这意味着我们通过对象实例的地址得到这张虚函数表,然后就可以遍历其中函数指针,并调用相应的函数。目前gcc 和微软的编译器都是将vptr放在对象内存布局的最前面。

#include <iostream>
using namespace std;
 
class Base {
   
public:
	virtual 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值