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

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

  • 相关阅读:
    LIS(nlogn) POJ 3903 Stock Exchange
    LCS(滚动数组) POJ 1159 Palindrome
    LCS(打印全路径) POJ 2264 Advanced Fruits
    3-16 提取任务(第6章)
    3-15 《元编程》第6章 3-16 hook method
    3-13《元编程》第5章Class Definitions 3-14(5-4Singleton Classes,2小时)3-15(3小时✅)
    3-11 《Ruby元编程》第4章block块 3-12
    3-9《元编程》第3章Tuesday:methods
    3-8《Ruby元编程》第二章对象模型
    2-27 最短路径《啊哈算法》2-28完成四种算法
  • 原文地址:https://www.cnblogs.com/xiaobaizzz/p/12346887.html
Copyright © 2020-2023  润新知