2021-05-28

      C++  类的自我理解

    typedef  basic_string<char>  string;//这是string的类型的由来。                                                                                   

  class B{

       private:

          int a;

          char *b;

  public:

  B():a(10),b(new char[100])

{

strcpy(this->b,"welcome");

}

//无参数构造函数

    B(int a,char b[])

          {     //系统默认第一个参数为  该类的this指针。即   B(B *this,int a,char b[])这个样子的

                 this->a = a;

                 this->b = new char[100];//从内存中申请100个字节的空间给b

                 strcpy(this->b,b);//将参数b中的数据,复制到b的值指向的内存中

          }

}

 

B bb;//声明一个B类的对象bb,则会在内存空间中找到一块内存,并且执行B类的无参数构造函数,内存图如下 :

  B类的内存示意图

变量名地址数据 
bb.a【bb对象中的a变量】假设bb中a的地址值为100000【此处存放的为a的地址】&bb.a10【此处存放的为a的真实值】bb.a
bb.b【bb对象中的b变量】假设bb中b的地址值为200000【此处存放的为b的地址】&bb.b300000[【假设new出来的那块内存的起始地址为300000开始的】bb.b
 300000【地址300000开始的100个字节空间】此时的100个字节从第1位开始存放“welcome”

                                                                                                                            bb对象

如果是指针则是这样:

   B * b1 = new B;

 内存空间会变成这个样子

         

变量名地址数据 
b10000000110000000
a1000000010
b1000000420000000
*b20000000welcome
   

 

              总结,b1的值为  &b1->a;     B * b1;过程      声明b1后,在内存中有一个指针变量名为b1【b1是有地址值的】,只是b1的值因为没有赋值,暂时未知;执行 b1 = new B;

后,会在内存中寻找一块能存放下sizeof(B)大小的空间,并把这个空间的首地址赋值给b1,以后就可以用b1 来操作这块new出来的内存了;【*b1就是这一块内存里面的所有内容】;

执行delete b1后,b1的值应该还是之前的那块空间的首地址,只是这块空间已经归还给内存了,它的内容可能已经发生变化了。

      含有虚函数的类里面会多增加4字节的空间,有个叫虚函数指针的东西需要占用四个字节的空间。

                                     

指针的原理:

    指针就是一个普通的变量,只是 这个变量的值为一个地址,通过这个地址可以操作这个内存地址中的值       

        如:

                int a = 100;    假如此时a在内存中的地址为  &a = 0X12345678

                则定义一个  int *p = &a;后,   p = &a = 0X12345678;     此时 可以用  *p = 200;去改变这个地址中的值

                                                                          

       class   A{

            private:

                int a;

                B b;

};

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值