【C++初学】C++核心编程(一):内存管理和引用

打印 上一主题 下一主题

主题 1888|帖子 1888|积分 5664

前言

在C++的世界里,面向对象编程(OOP)是核心中的核心。它不但是一种编程范式,更是一种思考问题的方式。本文将带你从C++的内存分区模子出发,深入探讨引用、函数、类和对象、继承、多态以及文件操作等核心概念。通过丰富的代码示例和详细的讲解,帮助你快速掌握C++面向对象编程的精髓。
1. C++内存分区模子

C++步调在运行时,内存被划分为四个重要地区:代码区、全局区、栈区和堆区。每个地区都有其独特的用途和生命周期。
1.1 步调运行前:代码区与全局区

代码区:存放函数体的二进制代码,由操作体系管理。代码区是共享且只读的,防止步调不测修改指令。
全局区:存放全局变量、静态变量和常量。全局区的数据在步调结束后由操作体系开释。
示例代码:
  1. // 全局变量
  2. int g_a = 10;
  3. int g_b = 10;
  4. // 全局常量
  5. const int c_g_a = 10;
  6. const int c_g_b = 10;
  7. int main() {
  8.     // 局部变量
  9.     int a = 10;
  10.     int b = 10;
  11.     // 打印地址
  12.     cout << "局部变量a地址为: " << (int)&a << endl;
  13.     cout << "局部变量b地址为: " << (int)&b << endl;
  14.     cout << "全局变量g_a地址为: " << (int)&g_a << endl;
  15.     cout << "全局变量g_b地址为: " << (int)&g_b << endl;
  16.     // 静态变量
  17.     static int s_a = 10;
  18.     static int s_b = 10;
  19.     cout << "静态变量s_a地址为: " << (int)&s_a << endl;
  20.     cout << "静态变量s_b地址为: " << (int)&s_b << endl;
  21.     cout << "字符串常量地址为: " << (int)&"hello world" << endl;
  22.     cout << "字符串常量地址为: " << (int)&"hello world1" << endl;
  23.     cout << "全局常量c_g_a地址为: " << (int)&c_g_a << endl;
  24.     cout << "全局常量c_g_b地址为: " << (int)&c_g_b << endl;
  25.     system("pause");
  26.     return 0;
  27. }
复制代码

1.2 步调运行后:栈区与堆区

栈区:由编译器自动分配和开释,存放函数的参数值和局部变量。注意,不要返回局部变量的地址。
堆区:由步调员手动分配和开释,若不开释,步调结束时由操作体系回收。
示例代码:
  1. int *func() {
  2.     int a = 10;
  3.     return &a; // 错误:返回局部变量的地址
  4. }
  5. int main() {
  6.     int *p = func();
  7.     cout << *p << endl; // 未定义行为
  8.     cout << *p << endl;
  9.     system("pause");
  10.     return 0;
  11. }
复制代码

堆区示例:
  1. int* func() {
  2.     int* a = new int(10);
  3.     return a;
  4. }
  5. int main() {
  6.     int *p = func();
  7.     cout << *p << endl;
  8.     delete p; // 释放堆区数据
  9.     system("pause");
  10.     return 0;
  11. }
复制代码

  1. int main()
  2. {
  3.         int* arr = new int[10];
  4.         int i = 0;
  5.         for (i = 0; i < 10; i++)
  6.         {
  7.                 arr[i] = i + 100;
  8.         }
  9.         for (i = 0; i < 10; i++)
  10.         {
  11.                 cout << arr[i] << endl;
  12.         }
  13.         delete[] arr;
  14.         system("pause");
  15.         return 0;
  16. }
复制代码

2. 引用

引用是C++中一个非常紧张的概念,它可以为变量起一个别名,简化代码并进步服从。
2.1 引用的基本利用

引用的语法是:数据范例 &别名 = 原名。
示例代码:
  1. int main() {
  2.     int a = 10;
  3.     int &b = a; // 引用b是a的别名
  4.     cout << "a = " << a << endl;
  5.     cout << "b = " << b << endl;
  6.     b = 100; // 修改b,a也会改变
  7.     cout << "a = " << a << endl;
  8.     cout << "b = " << b << endl;
  9.     system("pause");
  10.     return 0;
  11. }
复制代码

2.2 引用注意事项

引用必须初始化。
引用初始化后不能改变。
示例代码:
  1. int main() {
  2.     int a = 10;
  3.     int b = 20;
  4.     // int &c; // 错误:引用必须初始化
  5.     int &c = a; // 初始化后不能更改
  6.     c = b; // 赋值操作,不是更改引用
  7.     cout << "a = " << a << endl;
  8.     cout << "b = " << b << endl;
  9.     cout << "c = " << c << endl;
  10.     system("pause");
  11.     return 0;
  12. }
复制代码

2.3 引用做函数参数

引用可以作为函数参数,让形参直接修改实参的值,避免指针的复杂性。
示例代码:
  1. void mySwap03(int& a, int& b) {
  2.     int temp = a;
  3.     a = b;
  4.     b = temp;
  5. }
  6. int main() {
  7.     int a = 10;
  8.     int b = 20;
  9.     mySwap03(a, b);
  10.     cout << "a:" << a << " b:" << b << endl;
  11.     system("pause");
  12.     return 0;
  13. }
复制代码

2.4 引用做函数返回值

引用可以作为函数的返回值,但要注意不要返回局部变量的引用。
示例代码:
  1. int& test02() {
  2.     static int a = 20; // 静态变量
  3.     return a;
  4. }
  5. int main() {
  6.     int& ref2 = test02();
  7.     cout << "ref2 = " << ref2 << endl;
  8.     test02() = 1000; // 可以通过引用修改静态变量
  9.     cout << "ref2 = " << ref2 << endl;
  10.     system("pause");
  11.     return 0;
  12. }
复制代码

2.5 引用的本质

引用在C++内部实现是一个指针常量。编译器会自动处置惩罚所有的指针操作。
示例代码:
  1. void func(int& ref) {
  2.     ref = 100; // 内部转换为 *ref = 100
  3. }
  4. int main() {
  5.     int a = 10;
  6.     int& ref = a; // 自动转换为 int* const ref = &a
  7.     ref = 20; // 内部转换为 *ref = 20
  8.     cout << "a:" << a << endl;
  9.     cout << "ref:" << ref << endl;
  10.     func(a);
  11.     system("pause");
  12.     return 0;
  13. }
复制代码

2.6 常量引用

常量引用可以防止误操作修改实参。
示例代码:
  1. void showValue(const int& v) {
  2.     cout << v << endl;
  3. }
  4. int main() {
  5.     const int& ref = 10; // 编译器优化:int temp = 10; const int& ref = temp;
  6.     cout << ref << endl;
  7.     system("pause");
  8.     return 0;
  9. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表