封装、成员访问权限、内存布局、malloc、free、new、d

2019-10-11  本文已影响0人  叶子扬
C++.png

// struct:
struct Person{
    int m_age;
    void run(){
        cout << m_age << endl;
    }
};

//class:
class Person{
public:
    int m_age;
    void run(){
        cout << m_age << endl;
    }
};

// ------------
int main() {
    Person person;
    person.m_age = 10;
    person.run();
    
    Person *pPerson = &person;
    pPerson->m_age = 20;
    pPerson->run();
    return 0;
}


C++编程规范:(变量名规范参考)

ps:每个人都可以有自己的编程规范,没有统一的标准,没有标准答案,没有最好的编程规范


对象的内存布局:

思考:如果类中有多个成员变量,对象的内存又是如何布局的?

    Person person;
    person.m_age = 10;
    person.run();
    
// 在函数里创建对象,用上面的这种方式,它的内存存放在栈空间

每个应用都有自己独立的内存空间,其内存空间一般都有以下几大区域:

// 应用的内存空间布局:
|-------------------|
|                   |
|       栈空间      |
|-------------------|
|       堆空间      |
|-------------------|
|       代码区      |
|-------------------|
|       全局区      |
|                   |
|-------------------|
堆空间

堆空间的初始化
    // *p1未初始化
    int *p1 = (int *)malloc(sizeof(int));
    int *p2 = (int *)malloc(sizeof(int));
    // 把*p2的每一个字节都初始化为0
    memset(p2, 0, sizeof(int));
    int *p1 = new int;      // 未初始化
    int *p2 = new int();    // 初始化为0
    int *p3 = new int(5);   // 初始化为5
    int *p4 = new int[3];   // 未初始化
    int *p5 = new int[3](); // 3个数组元素初始化为0
    int *p6 = new int[3]{}; // 3个数组元素初始化为0
    int *p7 = new int[3]{5};// 数组首元素初始化为5,其他初始化为0
memset

memset函数是将较大的数据结构(比如对象、数组等)内存清零的比较快的方法

    Person person;
    person.m_id = 10;
    person.m_age = 10;
    person.m_height = 10;
    memset(&person, 0, sizeof(person));
    
    Person persons[] = {{0,3,105},{1,4,174},{2,6,182}};
    memset(persons, 0, sizeof(persons));

ps:memset分配几个字节,是由操作系统底层实现的

对象的内存

// 全局区
Person g_person;

int main() {
    // 栈区
    Person person;
    // 堆区
    Person *p = new Person;
    return 0;
}

this

上一篇 下一篇

猜你喜欢

热点阅读