C++学习01

程序的内存模型

1.内存四区

​ 代码区、全局区、栈区、堆区(代码区和全局区在程序执行前就有)

2.简单介绍

​ 2.1 代码区:

​ 存放CPU执行的机器指令

​ 代码区是共享的,也是只读的。

​ 2.2 全局区:

​ 存放了全局变量(在main函数之外)、静态变量(前面有static)

​ 其中还包含了常量区。(包括字符串常量、const修饰的全局常量)

​ 该区的数据在程序结束后由操作系统释放

​ 2.3 栈区:

​ 由编译器自动分配释放(函数执行完)

​ 存放函数的参数值(形参)、局部变量等(不要返回局部变量的地址!!

​ 2.4 堆区:

​ 由程序员分配释放,若不释放,则被系统回收

​ 主要用new关键字在该区开辟数据,用delete关键字释放内存。

​ new返回的是数据类型的指针

​ 释放数组时(eg. delete[] arr;)

构造函数&析构函数

  1. 构造函数用于初始化对象,同时为对象的成员属性赋值;析构函数用于清理对象,同时在对象销毁前调用执行清理工作

  2. 语法

    2.1 构造函数:类名(){}

    ​ 2.1.1.构造函数,没有返回值也不写void

    ​ 2.1.2.构造函数可以有参数,可以发生重载

    2.2 析构函数:~类名(){}

    ​ 2.2.1.析构函数,没有返回值也不写void

    ​ 2.2.2.析构函数不可以有参数,不可以发生重载

3.构造函数的分类&调用

​ 3.1 分类一(按照参数)

​ 3.1.1.无参构造(默认构造)

​ 3.1.2.有参构造

​ 3.2 分类二(按照类型)

​ 3.2.1.普通构造

​ 3.2.2.拷贝构造:

1
2
3
4
Person(const Person &p){
、、、
、、、
}

​ 3.3 调用

​ 3.3.1.括号法:

1
2
3
Person p1; //默认构造
Person p2(20); //有参构造
Person p3(p2); //拷贝构造

​ 3.3.2.显示法:

1
2
3
Person p1;
Person p2 = Person(20); //有参构造
Person p3 = Person(p2); //拷贝构造

​ 3.3.3.隐式转换法:

1
2
Person p4 = 20; //有参构造(相当于Person p4 = Person(20);)
Person p5 = p4; //拷贝构造

​ 3.4 深拷贝&浅拷贝

​ 3.4.1.浅拷贝:简单的赋值拷贝操作(存在的问题:使堆区的内存重复释放)

​ 3.4.2.深拷贝:在堆区重新申请空间,从而进行拷贝操作

​ 3.4.3.示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Person(const Person& p) { //深拷贝
cout << "Person的拷贝构造函数调用" << endl;
m_Age = p.m_Age;
//m_Height = p.m_Height; //编译器默认实现
m_Height = new int(*p.m_Height);
}

~Person() {
//析构代码,将堆区所开辟的数据释放
if (m_Height != NULL) {
delete m_Height;
m_Height = NULL;
}
cout << "Person的析构函数调用" << endl;
}

const修饰成员函数

常函数:

​ 1.成员函数后加const,称之为常函数

​ 2.常函数内不可以修改成员属性

​ 3.成员属性声明时加关键字mutable,在常函数中依然可以修改

常对象:

​ 1.声明对象前加const,称为常对象

​ 2.常对象只能调用常函数

未完待续…