c++复习-基础-从c到c++-类型限定符+存储类限定符+引用

这篇具有很好参考价值的文章主要介绍了c++复习-基础-从c到c++-类型限定符+存储类限定符+引用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考:
https://www.runoob.com/cplusplus/cpp-tutorial.html
和gpt生成的内容


类型限定符

  • const

    const int NUM = 10; // 定义常量NUM,值不能修改
    const int* ptr = # // 定义常量指针,指针所指的值不可修改
    int const* ptr2 = # // 与上一行等价
    
  • volatile

    • 表示可能被程序以外的因素改变,如硬件或线程
    volatile int num = 20;
    
  • restrict

    • C99中增加的,由restrict修饰的指针是唯一一种访问的方式
    • 它告诉编译器,在给定的代码块中,被标记为 restrict 的指针是唯一访问其所指向内存的指针,其他指针不能访问。因此编译器可以更自由地进行一些针对性的优化,如寄存器分配和指令重排
    • 并非所有编译器都支持,所以使用时需要考虑兼容性
    void foo(int* restrict a, int* restrict b, int n) {
        for (int i = 0; i < n; ++i) {
            a[i] += b[i];
        }
    }
    
  • mutable

    • 表示类中的成员变量可以在const成员函数中被修改
    • 成员函数带const表示不会修改对象中的数据成员,但是可以修改类的mutable数据成员
    class Example {
    public:
    		// mutable 关键字允许在 const 成员函数中修改成员变量
        void set_value(int value) const {
            value_ = value; 
        }
    private:
        mutable int value_;
    };
    
  • static

    • 静态变量的作用域仅限于当前文件或当前函数内。
    • 静态局部变量,只会初始化一次;而普通局部变量,每次函数调用都会重新初始化
    #include <iostream>
    
    void exampleFunction() {
        // 静态局部变量,只会初始化一次
        static int staticVariable = 0;
    
        // 普通局部变量,每次函数调用都会重新初始化
        int localVariable = 0;
    
        // 修改静态变量和普通变量
        staticVariable++;
        localVariable++;
    
        // 输出结果
        std::cout << "Static Variable: " << staticVariable << std::endl;
        std::cout << "Local Variable: " << localVariable << std::endl;
    }
    
    int main() {
        // 多次调用函数,观察静态变量和局部变量的变化
        exampleFunction();
        exampleFunction();
        exampleFunction();
    
        return 0;
    }
    /* 输出:
    Static Variable: 1
    Local Variable: 1
    Static Variable: 2
    Local Variable: 1
    Static Variable: 3
    Local Variable: 1
    */
    
  • register

    • register是建议编译器将变量存储在寄存器中,以提高程序执行速度,但是是否如此是由编译器决定的。

存储类限定符

  • auto

    • C++17开始,auto关键字不再是存储类说明符了
    • 用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。
  • register

    • C++17开始,register关键字被弃用
    • 不能用&,因为没有内存位置
  • static

  • extern

    • 提供一个全局变量的引用,即这个变量对所有的程序文件都是可见的。

    假设有两个文件

    // main.cpp
    #include <iostream>
     
    int count ;
    extern void write_extern();
     
    int main()
    {
       count = 5;
       write_extern(); // 输出5
    }
    
    // support.cpp
    #include <iostream>
     
    extern int count;
     
    void write_extern(void)
    {
       std::cout << "Count is " << count << std::endl;
    }
    
  • mutable

  • thread_local

    • c++11
    • 用于声明线程局部存储的变量。线程局部存储意味着每个线程都有其自己独立的变量实例,不同线程之间的变量互不影响
    • thread_local 说明符可以与 static 或 extern 合并。
    • 可以将 thread_local 仅应用于数据声明和定义,thread_local 不能用于函数声明或定义

    编译命令是:g++ -std=c++11 hello.cpp -o hello -pthread

    (base) [p@localhost ~]$ g++ -std=c++11  hello.cpp -o hello 
    (base) [p@localhost ~]$ ./hello
    terminate called after throwing an instance of 'std::system_error'
      what():  Enable multithreading to use std::thread: Operation not permitted
    已放弃(吐核)
    (base) [p@localhost ~]$ g++ -std=c++11  hello.cpp -o hello -pthread
    
    #include <iostream>
    #include <thread>
    
    thread_local int threadLocalVariable = 0;
    
    void exampleFunction() {
        // 修改线程局部变量
        threadLocalVariable++;
        // 输出结果
        std::cout << "Thread ID: " << std::this_thread::get_id() << ", Thread Local Variable: " << threadLocalVariable << std::endl;
    }
    
    int main() {
        // 创建两个线程并调用函数
        std::thread thread1(exampleFunction);
        std::thread thread2(exampleFunction);
    
        // 等待线程执行完毕
        thread1.join();
        thread2.join();
    
        return 0;
    }
    

基本输入输出

对象 说明
cin 标准输入流
cout 标准输出流
cerr cerr << 标准错误流。cerr对象是非缓冲的,会立即输出
clog clog << 标准日志流。clog对象是缓冲的,只有缓冲区满或者刷新时才输出

引用

引用变量是一个别名,即一个已经存在的变量的另一个名字。

引用与指针的区别:

  • 不存在空引用,引用必须连接到一块合法的内存
  • 一旦引用被初始化为一个对象,就不能再指向另一个对象,但是指针可以在任何时候指向另一个对象
  • 引用必须在创建的时候初始化,但指针可以在任何时间初始化
int& r = i; // r是一个被初始化为i的整型引用

引用作为参数传递给函数没什么好说的,但是函数返回引用需要注意:要么返回的引用,其指向的变量是本文件的全局变量,要么返回的是静态变量的引用。(被引用的对象不能超出作用域)文章来源地址https://www.toymoban.com/news/detail-816103.html

到了这里,关于c++复习-基础-从c到c++-类型限定符+存储类限定符+引用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】C++ 引用详解 ① ( 变量的本质 - 引入 “ 引用 “ 概念 | 引用语法简介 | 引用做函数参数 | 复杂类型引用做函数参数 )

    \\\" 引用 \\\" 语法 是 C++ 语言中 特有的 , 在 C 语言中是没有 引用 这个概念的 ; 分析 引用 之前 , 先回顾下 变量 : 在 【C 语言】变量本质 ( 变量概念 | 变量本质 - 内存空间别名 | 变量存储位置 - 代码区 | 变量三要素 ) 博客中 , 介绍了变量的本质 : 变量 的本质是 内存空间 的 \\\" 别名

    2024年02月11日
    浏览(49)
  • 【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)

    🔥 个人主页 : Forcible Bug Maker 🔥 专栏 : C++ 目录 前言 什么是面向对象? 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象的存储方式 this指针 结语 最早的C++版本(C with classes)中,最先加上的就是类的机制,它构成了面向对象编程(OOP)的

    2024年04月14日
    浏览(55)
  • vue3引用类型和基础类型深度克隆

    深度克隆失效的一个例子 原因是list1和list2初始值用中括号[],但是navArr遍历的时候是对象的方式赋值, 虽然不影响list1赋值,但是类型错了,导致深度克隆会失败, 改成 花括号 对象方式初始值 修改后

    2024年02月02日
    浏览(57)
  • C++ vector元素类型为什么不能是引用

    vectorT 引用必须要进行初始化,不能初始化为空对象,初始化后不能改变指向 引用是别名,不是对象,没有实际地址, 不能定义引用的指针 ,也 不能定义引用的引用 推荐一个零声学院项目课,个人觉得老师讲得不错,分享给大家: 零声白金学习卡(含基础架构/高性能存储

    2024年02月15日
    浏览(59)
  • 【C++】引用 | auto类型 |范围for |使用nullptr的原因

    引用不是新定义一个变量,而是 给已存在的变量取别名 ,编译器不会为引用变量开辟内存空间,它和它引用的变量 公用同一块内存空间 比如说 李逵,在家称为\\\"铁牛\\\", 江湖上人称\\\"黑旋风\\\" 这两个称号都是他的 b是a的引用,也就是起了一个别名,a再取了一个名称 同时改变别

    2024年01月16日
    浏览(40)
  • Java基础知识——类、静态、继承、引用类型使用

    类的定义格式如下: 例如: 例如: 1.3.1 封装的步骤 1.使用 private 来修饰成员变量。 2.使用 public 修饰getter和setter方法。 1.3.2 封装的步骤实现 private修饰成员变量 public修饰getter和setter方法 1.4.1 构造器的作用 通过调用构造器可以返回一个类的对象,构造器同时负责帮我们把

    2023年04月19日
    浏览(48)
  • Python中的弱引用与基础类型支持情况探究

    最近有一个业务场景需要用Python自行实现一个简单的LRU cache,不可避免的接触到了弱引用这一概念,这里记录一下。 Python内存回收由垃圾回收器自动管理,当一个对象的引用计数归0时,其内存就可能被回收掉,而引用计数器的数值其实就是代表有多少个强引用指向该对象,

    2024年02月16日
    浏览(38)
  • C语言——结构体类型(一)【结构体定义,创建,初始化和引用】

    📝前言: 在实际编程过程中,我们可能会希望把一些关联的数据存放在一起,这样方便我们使用。但是这些数据的类型有时候并不一致,例如一个学生的信息:有名字(字符串),有年龄(整数),性别(字符)······这时候,我们就可以使用 自定义类型——结构体类型

    2024年02月03日
    浏览(48)
  • 【c++入门】引用详解 | auto的类型推导 | 范围for循环 | nullptr空指针

    🎥 屿小夏 : 个人主页 🔥个人专栏 : C++入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 上篇文章中,对函数重载和内联函数的作用和特性使用,进行了精细的详解。 引用和指针混不清?引用的抽丝剥茧!还有不用写类型可以自动推导的?for遍历竟然还有我们没见过的面

    2024年02月06日
    浏览(140)
  • 【C++】C++入门基础:引用详解

    本篇继续分享关于C++入门的相关知识,有关命名空间、缺省参数和函数重载的部分欢迎阅读我的上一篇文章【C++】C++入门基础详解(1)_王笃笃的博客-CSDN博客 继续我们的学习 在C语言中我们接触过指针,很多人都或多或少为他感到头痛过,很多C语言的使用者包括创始人都觉

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包