正在阅读:《编程高手箴言》读后(4)《编程高手箴言》读后(4)

2004-04-08 14:39 出处:CSDN 作者:seacloud 责任编辑:sdq

  如果你用sizeof()作用在这令各class上,就会发现,它们大小是一样的,B不会因为多了一个方法而导致其size变大。(当然,你如果将sayHello用virtual申明为虚方法,那么编译器会在你的类前面加一个所谓的VTable,其实就是一个32位指针,会导致你的class变大的,如果你用virtual修饰sayHello,那么class B就会比class A大4个bytes)另外,对于类里面的方法,只要在程序里定义了,那么在运行期不管你有没有生成这个类的实例,其实这些方法代码已经存在了,甚至我们可以用一些“脏”代码来调用:

  #include <iostream>
  using namespace std;

  class A
  {
  public:
      int a;
      void sayHello() { cout << "A::sayHello()" << endl; }
  };

  int main()
  {
      A   *pa;

      pa = NULL;     //注意这里,并不会导致下面的语句出错,在vc和gcc里都pass
      pa->sayHello();

      return 0;
  }
  
  大家可以编译出来看看,运行的话就会打出"A::sayHello()",呵呵,我们根本就没有生成A的实例A的方法就已经存在了。编译器会“理解”我们的目的,看到(A *)->sayHello,就会替我们调用适当的函数。当然了,sayHello里可不能使用自己的成员变量,比如int a,否则就会因为this指针不对而出错,毕竟我们没有生成A的实例嘛。

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品