0%

C++面向对象学习笔记

C++核心编程

1. 内存分区模型

C++在执行时,将内存大方向划分为4个区域

  • 代码区:函数体的二进制代码,由操作系统进行管理

  • 全局区:存放全局变量和,静态变量以及常量

  • 栈区:由编译器自动分配释放,存放函数的参数值局部变量

  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

意义

不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程

1.1 程序运行前

程序编译后,生成exe可执行程序,执行前分为两个趋于

代码区

​ 存放cpu执行的机器指令(就是你写的代码)

​ 代码区是共享的,频繁执行的程序,只需要有一份代码即可

​ 代码区是只读的,防止程序意外修改

全局区

​ 存放全局变量和静态变量

​ 全局区还包含了常量区,存放字符串常量和其他常量

 该区域的出局在程序结束后由操作系统释放
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;

//全局变量
int g_a = 20;
int g_b = 20;

//const修饰的全局变量,全局常量
const int c_g_a = 10;
int main()
{
//局部变量,写在函数体内的
int a = 10;
int b = 20;
cout << "a:" << (int)&a << endl;
cout << "b:" << (int)&b << endl;

cout << "g_a:" << (int)&g_a << endl;
cout << "g_b:" << (int)&g_b << endl;

//静态变量
static int s_a = 10;
cout << "s_a:" << (int)&s_a << endl;

//常量
//字符串常量
cout << "hello world:" << (int)&"hello world" << endl;

//const修饰的变量
//const修饰的全局变量,const修饰的局部变量
const int c_l_a = 10;

cout << "c_l_a:" << (int)&c_l_a << endl;
cout << "c_g_a:" << (int)&c_g_a << endl;

system("pause");
return 0;
}
​```
1
2
3
4
5
6
7
8
a:2130114772
b:2130114804
g_a:2061226064
g_b:2061226068
s_a:2061226072
hello world:2061216720
c_l_a:2130114836
c_g_a:2061216864

1.2 程序运行后

栈区

由编译器自动分配释放,存放函数的参数值,局部变量等

注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放(但是我用vs2022可以一直保留局部变量)

堆区

由程序员分配释放,若程序员不释放,程序结束时由操作系统回收

在c++中主要利用new在堆区开辟内存

由程序员手动开辟,手动释放,释放利用操作符delete

语法:new 数据类型

利用new创建的数据,会返回该数据对应的类型的指针

2. 引用

2.1 引用的基本使用

作用:给变量起别名

语法:数据类型 &别名=原名

2.2 引用的注意事项

  • 引用必须初始化
  • 引用在初始化后,不可以改变

image-20220731214304876

2.3 引用做函数参数

作用:函数传参时,可以利用引用的技术让实参修饰形参

优点:可以简化指针修改实参

1
2
3
4
5
6
void mySwap01(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}

总结通过引用参数产生的效果和地址传递是一样的,引用的语法更清楚简单

2.4 引用做参数的返回值

作用:引用是可以作为函数的返回值存在的

注意不要返回局部变量引用

用法:函数调用作为左值(等号左边)

1
2
3
int& ref = test01();

test01() = 1000;

2.5 引用的本质

本质:引用的本质在C+=内部实现是一个指针常量

1
2
int& ref = a;//自动转换为 int* const ref = &a; 
ref = 20;//自动转换为 * ref = 20;

结论C++推荐使用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针编译器都帮我们做了

2.6 常量引用

作用:常量引用主要用来修饰形参,防止误操作

在函数形参列表中,可以加const修饰形参,防止形参改变实参

void print(const int &a)

3.函数提高

3.1 函数的默认参数

形参可以有默认值

语法:返回类型值 函数名 (参数=默认值){}

注意

  • 如果自己传入数据,则用自己传的,没有传则用默认的
  • 默认参数必须在形参列表结尾
  • 函数声明和实现只能有一个有默认参数

3.2 函数占位参数

函数的形参列表里可以有占位参数,用来占位,调用函数时必须填补该位置

语法:返回值类型 函数名 (数据类型){}

占位参数可以有默认参数

3.3 函数重载

3.3.1 函数重载概述

作用:函数名可以相同,提高复用性

函数重载满足条件:

  • 同一个作用域下
  • 函数名相同
  • 函数参数类型不同个数不同顺序不同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void func()
{
cout << "func的调用" << endl;
}
void func(int a)
{
cout << "func的调用" << endl;
}
void func(double a)
{
cout << "func的调用" << endl;
}
void func(int a,double b)
{
cout << "func的调用" << endl;
}
void func(double a,int b)
{
cout << "func的调用" << endl;
}

注意:

  • 函数的返回值不可以作为函数重载的条件

  • 引用可以作为重载的条件

    注意:int &aconst int &a可以作为重载的条件。当传入变量(int a=10)时调用使用int &a的函数,当直接传入确定数值(10)时调用使用const int &a的变量。

  • 函数碰到默认参数时,要排除默认参数后剩下的函数参数类型不同个数不同顺序不同,才可以重载。

4 类和对象

(我感觉和结构体很像,但是百度之后发现,他们默认的访问权限不一样,而且类是有继承的,结构体没有继承。)

  • C++结构体内部成员变量及成员函数默认的访问级别是public,而c++类的内部成员变量及成员函数的默认访问级别是private。
  • C++结构体的继承默认是public,而c++类的继承默认是private。

C++面向对象的三大特性:封装,继承,多态

C++认为万事万物皆有对象,对象上有其属性的行为

4.1 封装

(1) 封装的意义

封装是C++面向对象三大特性之一

封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物

  • 将属性和行为加以权限控制

    意义一:

在设计的时候,属性和行为写在一起,表现事物

语法:class 类名{ 访问权限: 属性/行为 }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
using namespace std;

//设计一个圆类,计算圆周长
//圆周率
const double Π = 3.14;

//class代表一个类,类后面紧跟着的就是类名称
class circle
{
//访问权限
//公共权限
public:

//属性
//半径
int m_r;

//行为
//获取圆的周长
double calcuateZC()
{
return 2 * Π * m_r;
}
};
int main()
{
//通过圆类,创建具体的圆(对象)
circle c1;
//给圆对象的属性赋值
c1.m_r = 10;

cout << "圆的周长为:" << c1.calcuateZC() << endl;

system("pause");
return 0;
}

类中的属性和行为同意成为成员

  • 属性:成员属性,成员变量
  • 行为:成员函数,成员方法

也可以通过行为给属性赋值

意义二:

类在设计时可以把属性和行为放在不同的权限下,加以控制

访问权限有三种:

  • public 公共权限 类内类外都可以访问呢
  • protected 保护权限 类内可以访问,类外不可以
  • private 私有权限 类内可以访问,类外不可以

(2)成员属性设置为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,我们可以检测数据的有效性