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.a | 10【此处存放的为a的真实值】bb.a |
bb.b【bb对象中的b变量】 | 假设bb中b的地址值为200000【此处存放的为b的地址】&bb.b | 300000[【假设new出来的那块内存的起始地址为300000开始的】bb.b |
300000【地址300000开始的100个字节空间】 | 此时的100个字节从第1位开始存放“welcome” |
bb对象
如果是指针则是这样:
B * b1 = new B;
内存空间会变成这个样子
变量名 | 地址 | 数据 |
b1 | 00000001 | 10000000 |
a | 10000000 | 10 |
b | 10000004 | 20000000 |
*b | 20000000 | welcome |
总结,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;
};