• C++随心记(四)


    1. 指针和引用的区别,如何实现

            1. 指针是一个实体;引用是某变量的别名

            2. 引用在定义时必须初始化,一旦与某个变量绑定后不可改变;指针变量可变

            3. 引用不能为空;指针可以为空(指针一般指某块内存的地址,因此可以为空)

            3. 自增(++),自减(--)的含义不一样

            4. sizeof 引用得到的是所指向的变量(对象)的大小;sizeof 指针得到的是指针本身(所指向的变量或对象的地址)的大小

            5. 引用底层是用指针实现的,引用其实是指针的一种语法糖。主流编译器都会选择将C++中的引用解释为“const指针”(实现);引用本身存放的是引用对象的地址,所占的内存大小就是指针的大小。

            6. 安全检查:由3可知,引用由编译器保证初始化,不像指针在使用的时候需要判断是否为空。

    2. static 关键字的用法和作用

    C++中初始化一共有两种用法,第一种:面向过程;第二种:面向对象。前者应用于普通变量和函数,用于构建静态全局变量静态局部变量静态函数;后者主要说明static在类中的作用,用于构建静态成员变量静态成员函数

    2.1 静态成员变量

            a. 静态成员变量属于类,不独属于某个具体由对应类定义的具体对象,在对象间共享,即无论类的对象被定义了多少个,静态成员变量分配一次内存,且不占用对象的内存,由所有对象共享,可以更新

            b. 静态成员变量在编译时 + 全局存储区分配内存;静态成员变量在编译过程中的初始化时分配内存;non - const 静态成员变量必须初始化,且只能在类外进行;const 静态成员变量必须声明且初始化;初始化的时候可以赋初值,不赋值默认为0。

            c. 使用过程遵循 public,protected,private访问规则。

            d. sizeof 运算符不会计算 静态成员变量。

    1. #include
    2. class Myclass
    3. {
    4. public:
    5. Myclass(int a, int b, int c);
    6. void GetSum();
    7. private:
    8. int a, b, c;
    9. static int Sum;//声明静态数据成员
    10. };
    11. int Myclass::Sum=0; //定义并初始化静态数据成员

    2.2 静态成员函数

            a. 静态成员函数同样属于类,不独属于某一个对象

            b. 静态成员函数仅可以访问静态成员变量和其它静态成员函数;非静态成员函数可以任意访问静态成员变量和函数;

            c. 相比于普通函数,静态成员函数不具有隐含的 this 指针,因此无法访问类对象的非静态成员。

    2.3 静态全局变量

    1. // 文件A
    2. #include
    3. static int n; // 定义静态全局变量,并自动初始化为0
    4. void main()
    5. {
    6. n = 20;
    7. cout << n << endl;
    8. }
    9. // 文件B
    10. #include
    11. extern int n;
    12. int func()
    13. {
    14. n ++ ; // 企图访问文件A中的全局静态变量 n !
    15. cout << n << endl;
    16. return 0;
    17. }

    上述代码能够通过编译,但运行时报错。因此得出如下结论:

            a. 定义:在全局变量前,增加 static 关键字即可完成全局静态变量的定义。

            b. 存储在内存中的位置:静态存储区,在整个程序运行期间一直存在。

            c. 初始化:程序执行到变量声明处时初始化,默认初始化为0,且只会初始化一次。

            d. 作用域:全局静态变量从定义开始,一直到文件结尾都可见;在文件之外不可见。

    2.4 静态局部变量

            a. 在局部变量之前,增加 static 关键字即可局部静态变量的定义。

            b. 存储在内存中的位置:静态存储区。

            c. 初始化:程序执行到变量声明处时初始化,默认初始化为0,且只会初始化一次

            d. 作用域:作用域和局部变量一样,仍然是局部作用域,即从变量声明开始,到函数或者语句块结束的位置。但是!当静态局部变量离开作用域后,并不会销毁,仍然驻留在内存中,此时不能对其进行访问,直到再次调用函数(值维持上一次调用后的结果)。

    1. void funcA();
    2. void funcA()
    3. {
    4. static int n = 0;
    5. std::cout << n << std::endl;
    6. n ++ ;
    7. }
    8. int main()
    9. {
    10. funcA(); // 0
    11. funcA(); // 1
    12. funcA(); // 2
    13. return 0;
    14. }

    2.5 静态函数

    a. 在普通的函数返回类型前增加 static 关键字即可声明、定义。

    b. 作用域:仅在静态函数声明的文件中可见

    3. c++内存分配

    c ++ 将程序使用到的内存划分为5个区域:

    地址自上而下看——由高到底,所以栈在内存分配时,地址由高到低;堆在内存分配时,地址由低到高。

    图转载自:C语言:内存分配---栈区、堆区、全局区、常量区和代码区_根号五的博客-CSDN博客_c语言内存堆区

    3.1 栈区:由编译器控制内存的分配与释放,多用于存放函数的参数 + 局部变量的值等,其存储空间是连续的;函数调用结束后函数的返回值也会存在这里;释放顺序和一般栈的概念很像,遵循先进后出原则。

    3.2 堆区:一般由程序猿控制内存的申请、分配与释放(malloc / new -- free / delete);如果申请的内存不手动释放,在程序结束时可能会由OS释放,而那些仍然不能释放的内存可能会造成内存泄漏;存储空间不一定连续,即连续声明的指针变量,指向的两块内存不一定连续。

    3.3 全局 / 静态存储区:该区域由.bss段 和 .data段组成。全局 / 局部静态变量和全局变量的存储区域,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被OS释放;

    该内容真实性待定)值得注意的是,初始化的全局变量和静态变量存储在一块区域,即 .data,程序结束后由OS释放。

    未初始化的全局变量和未初始化的静态变量 / 初始化为0的全局变量和初始化为0的静态变量 存储在相邻的另一块区域,即 .bss 程序结束后由OS释放。

    3.4 文字常量区:不允许修改的常量的存储区域(可通过非正当手段修改)。程序结束后由OS释放。

    3.5 程序代码区:存放函数体内的二进制代码,由OS管理。

    3.6 代码示例

    1. int a = 0; // 全局变量,全局初始化区
    2. static int b = 0; // 全局静态变量,全局初始化区
    3. char * p1; // 全局未初始化区
    4. int main() {
    5. int a; // 栈区
    6. char s[] = "abc"; // "abc/0"在常量区,s在栈中
    7. char *p1; // 未初始化局部变量,栈
    8. char *p2 = "123456"; // "123456/0"在常量区, p3在栈区
    9. static int c = 0; // 静态局部变量,全局初始化区
    10. p1 = (char *)malloc(10); // 申请、分配的10和20字节的区域在堆区
    11. p2 = (char *)malloc(20);
    12. }

  • 相关阅读:
    PyTorch官方文档学习笔记(备忘)
    HUD前装增速大幅下滑?市场格局分化/新玩家陆续入场
    clang llc llvm-link llvm-config 应用示例
    Java学习之--类和对象
    数据结构与算法之美读书笔记6
    CentOS Stream 9-使用 systemd 管理自己程序时自定义日志路径
    【附源码】Python计算机毕业设计商场会员管理系统
    EN 14351-1窗和外部行人门—CE认证
    给定两个单链表,编写算法找出两个单链表的公共结点(暴力解题,优化解题)
    [MyBatis] SQL动态标签,SelecKey标签
  • 原文地址:https://blog.csdn.net/xiao_ling_yun/article/details/126141950