• C++学习笔记之 const


    const

    链接属性

    C语言默认是外部链接属性

    // test.c
    const int m_A = 0; // C语言下默认是外部链接属性
    
    // main.c
    #include <stdio.h>
    
    int main()
    {
        extern const int m_A; // 告诉编译器外部有一个m_A
        // 外部链接属性即别的文件不需要包含头文件就能访问
    
        printf("m_A = %d",m_A);
        return 0;
    }
    
    m_A = 0
    

    C++默认是内部链接属性

    // test.cpp
    const int m_A = 0; // C++下默认是内部链接属性
    
    // main.cpp
    #include <cstdio>
    
    int main()
    {
        extern const int m_A; // 报错
    
        printf("m_A = %d",m_A);
        return 0;
    }
    

    解决方法:提高作用域

    // test.cpp
    extern const int m_A = 0;
    

    const分配内存情况

    #include <iostream>
    #include <cstdlib>
    #include <string> // 输出string时需要的头文件
    
    using namespace std;
    
    // 1. 对const修饰的局部变量取地址,会分配临时内存
    void test01()
    {
        const int a = 0;
        int *p = (int*)&a; // 会为a分配临时内存空间
    }
    
    // 2. 使用变量初始化const修饰的局部变量
    void test02()
    {
        int a = 0;
        const int m_A = a; // 会分配内存
    
        int *p = (int*)&m_A;
        *p = 100;
        cout << m_A << endl;
    }
    
    // 对于自定义的数据类型也会分配内存
    struct Person
    {
        string name;
        int age;
    };
    
    void test03()
    {
        const Person p1;
        // p1.name = "张三";
        // p1.age = 18;
    
        Person *p = (Person *)&p1;
        p->name = "李四";
        p->age = 19;
    
        cout << p1.name << "年龄:" << p1.age << endl;
    }
    
    int main()
    {
        test02();
        test03();
        return EXIT_SUCCESS;
    }
    

    尽量用const代替#define

    如果因为常量的使用报错,#define会很难找到是哪里出了问题

    • 区别
      • #define
        • 没有作用域
        • 没有数据类型
      • const
        • 有类型,可以进行编译器安全检查
        • 有作用域
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    #define MAX 1024
    
    void func(int a)
    {
        cout << "func(int a)" << endl;
    }
    
    void func(short a)
    {
        cout << "func(short a)" << endl;
    }
    
    int main()
    {
        func(MAX); // 调用哪个函数由编译器决定
        return EXIT_SUCCESS;
    }
    
    func(int a)
    
  • 相关阅读:
    cocos代码研究(24)Widget子类PageView学习笔记
    cocos代码研究(23)Widget子类ScrollView学习笔记
    cocos代码研究(22)Widget子类Layout学习笔记
    JavaScript:学习笔记(5)——箭头函数=>以及实践
    顽石系列:CSS实现垂直居中的五种方法
    算法:红黑树
    Vue:实践学习笔记(3)——组件使用
    Java进阶学习:将文件上传到七牛云中
    LeetCode:下一个排列【31】
    Linux:Ubuntu下部署Web运行环境
  • 原文地址:https://www.cnblogs.com/zhujiangyu/p/13904668.html
Copyright © 2020-2023  润新知