前面学习了静态成员和函数 最后一幅图抛出了一块砖 http://blog.youkuaiyun.com/x_y_q_/article/details/52164506 因为我们知道c++是在c的基础上进行拓展的嘛,很多看似高大上的功能其实我们花点时间去想想,去做做试验,便会知晓c++的那帮大牛们是怎么用原有的c语言的面向过程的思维去创造出这个我们看似全新的面向对象的思想理念。所以,我们很自然地会想去揭开c++面向对象那层神秘的面纱,一睹究竟。
还是先抛砖,现有下面一段代码,我们来做个小实验,看看一个类的长度到底是多少。(其中,函数,便是一个指针,指向函数的地址,他们的大小可以看作4个字节,一个指针变量所占用的内存大小嘛)
我们先在代码中标记出我们的预估值
#include <iostream>
#include <string.h>
using namespace std;
class C1{
public:
int i;//4字节
int j;//4字节
int k;//4字节
};//12字节
class C2{
public:
int i;//4
int j;//4
int k;//4
static int m;//4 或 0
public:
int getk(){return k;}//4 或 0
void setK(int val) {k = val;}//4 或 0
};//24 或 20 或 12
struct S1{
int i;//4
int j;//4
int k;//4
};//12
struct S2{
int i;//4
int j;//4
int k;//4
static int m;//4
};//16
int main()
{
cout << sizeof(C1) << endl;
cout << sizeof(C2) << endl;
cout << sizeof(S1) << endl;
cout << sizeof(S2) << endl;
return 0;
}
下面来运行这串代码
结果似乎出人意料,但也可以在一定程度上反映了我们要探究的问题:
c++中的成员对象和成员函数是分开存储的
普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式
静态数据变量:存储于全局数据区中
成员函数:储存于代码段中
那么,问题又来了,很多对象共用一块代码,代码是如何区分具体对象的呢?换句话说,int getk() const {return k;} 代码是如何区分,具体obj1 obj2 obj3 的对象的k值呢?
其实,这里只是编译器在函数中隐藏了 this 指针,this指针是什么呢,就是指向某一个对象自身的指针。这样,在构造函数的时候,已经向形参里传入了this指针,在下面图片 中也
可以看出来。我们可以之后做一个关于this指针的实验。
静态成员函数里没有this指针
这就是c++对成员变量和成员函数的内部处理,仔细读图,是不是能反映以上几点呢。
下面,来进行this指针的实验
#include <iostream>
using namespace std;
class Test{
public:
Test(int a, int b){
this ->a = a;
this ->b = b;
}
void printT(){
cout << "a: " << a << endl;
cout << "b: " << b << endl;
}
private:
int a;
int b;
};
int main()
{
Test t1(1, 2);//这里,谁调this,this就是谁,这里就是t1的地址
t1.printT();//
return 0;
}
运行结果