类是创建对象的模板,不占用内存空间,不存在于编译后的可执行文件中。
对象是实实在在的数据,需要内存来存储,对象被创建时会在栈区或者堆区分配内存。
#include<iostream>
#include<string>
using namespace std;
class Student{
private:
string m_name;
int m_age;
float m_score;
public:
void setname(string name);
void setage(int age);
void setscore(float score);
void show();
};
void Student::setname(string name){
m_name = name;
}
void Student::setage(int age){
m_age = age;
}
void Student::setscore(float score){
m_score = score;
}
void Student::show(){
cout<<m_name<<"的年龄是"<<m_age<<",成绩是"<<m_score<<endl;
}
int main(){
//在栈上创建对象
Student stu;
cout<<sizeof(stu)<<endl;
//在堆上创建对象
Student *pstu = new Student();
cout<<sizeof(*pstu)<<endl;
//类的大小
cout<<sizeof(Student)<<endl;
return 0;
}
/*运行结果*/
16 //string占8个字节、int和float都占4个字节 = 16字节
16 //说明对象所占的内存仅仅包含了成员变量
16 //计算类的大小时,只计算了成员变量的大小,并没有把成员函数包含在内
成员函数的调用
成员函数最终被编译成与对象无关的全局函数,成员变量的作用域不是全局,如果成员函数中使用到了成员变量怎么办?
C++规定,编译成员函数时要额外添加一个参数,把当前对象的指针传递进去,通过指针来访问成员变量。
通过传递对象指针完成了成员函数和成员变量的关联。这与我们表面看到的刚好相反,通过对象调用成员函数时,不是通过对象找函数,而是通过函数找对象。这一切都是隐式完成的,对程序员来说完全透明,就好像这个额外的参数不存在一样。