C++ 成员函数的实现

类是创建对象的模板,不占用内存空间,不存在于编译后的可执行文件中。

对象是实实在在的数据,需要内存来存储,对象被创建时会在栈区或者堆区分配内存。

image

#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++规定,编译成员函数时要额外添加一个参数,把当前对象的指针传递进去,通过指针来访问成员变量。

通过传递对象指针完成了成员函数和成员变量的关联。这与我们表面看到的刚好相反,通过对象调用成员函数时,不是通过对象找函数,而是通过函数找对象。这一切都是隐式完成的,对程序员来说完全透明,就好像这个额外的参数不存在一样。

原文地址:https://www.cnblogs.com/xiaobaizzz/p/12346887.html