深入理解C++对象的构造过程(笔记)

  1. 如果我们要通过某个class_A来instance一个对象object_A,通常要include class_A所在的头文件(class_A.h)。我的问题是,include class_A.h的作用是什么?

答:

  • 很自然的,也是很表面的一个问题是,如果你不include class_A.h,编译会报错,会显示class_A是一个undefined type.
  • 深层次的理解是:include class_A是给编译器提供该class的原型,编译器根据这个原型来为object_A来分配空间。所以,需要记住的知识点是:为对象分配空间这一步在编译阶段就做完了。
  1. 构造函数的作用是什么?

答:

  • 构造函数只是把上一步编译器分配好的空间进行初始化和赋值。初始化是通过初始化列表来完成的,赋值是通过构造函数 “{ }” 内的赋值语句来完成的。
  1. C++的成员函数是怎么找到成员变量的。

答:

  • 我们都知道c++中有一个重要的this 指针。这个指针是指向对象的,在我们的例子中也就是指向object_A的。在每个成员函数的实现过程中,我们作为C++的用户,虽然没有显示的把this指针添加到成员函数的形参列表中,但是编译器会帮我们在每个成员函数的形参列表中增加this指针。
  • 因为this指针是指向对象的,当然通过this指针就可以访问到所有的成员变量。
  1. 对于在比较大的project中经常遇到的问题:相同的class名称:class_A,但是class有不同的实现分别在class_A.h/.cpp, class_AA.h/.cpp。然后这两个实现分别被编译到了两个libA.so和libAA.so中。那么在-l(小写的L)的时候如果先-lA,那么使用整个project中使用的都会是class_A这个实现(无论你在instance对象的时候include是class_A.h还是class_AA.h)。
  • 这个其实也很好理解,如果你看过编译链接相关的资料的话(推荐《程序员的自我修养》这本书),那么你应该知道链接过程其实就是把未解决的symbol重定位到合适的地址的过程。那么对于class_A.h和class_AA.h,由于里面的class的名称都是class_A,那么class_A.h和class_AA.h内部的同名成员函数就会具有相同的符号。
  • 链接的原则是,如果有两个同名的符号,以先找到的符号为准,后面即使找到相同的符号也不起作用。
  • 那么,你就理解了,先-lA,就先找到class_A.h中的实现,所以整个project就会都使用class_A.h对应的实现。
  • 更近一步,如果你分别在两个构造函数中使用sizeof(*this)尝试取得该对象的大小,那么sizeof(*this)的值取决于你实际使用的构造函数(取决于你所link的是 libA.so or libAA.so)所在的文件所include的头文件是哪个(class_A.h or class_AA.h)。
  1. C++的this指针介绍(《C++ primer》P231)
  • this默认是一个指向非常量的常量指针(即 class_A * const ),这个拗口的概念可以参考《C++ primer》P56,所以一个常量对象是没办法使用这个默认的this指针(即指向非常量的常量指针)。此时就需要一个机制将this声明为指向常量的常量指针(即const class_A * const), 即在形参列表之后加一个const关键字,将成员函数设置为常量成员函数。
  • 因为可以将一个非常量赋值给常量,所以非常量对象可以调用常量成员函数。参考:https://blog.csdn.net/hou09tian/article/details/81669348
  1. C++是依靠偏移来取的成员变量的值得,详细见《王道程序员面试宝典》p168例2。

在这里插入图片描述

参考:
7. C++类对象创建过程揭密
8. this 确实指向了当前对象,而且对于不同的对象,this 的值也不一样.
9. C++对象的生命周期,构造与析构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值