C++关键字

C++关键字

static

类和结构体外的static

被static修饰后只在内部发生链接,其作用域只在其所在的文件中。

类和结构体内的static

struct Entity
{static int x, y;	静态成员变量static void Print(){std::cout << x << "," << y << std::endl;}
};
int Entity::x;	//类中的静态变量需单独声明
int Entity::y;

静态成员变量:

  • 若static修饰变量,在所有类的实例中,此静态成员变量只有一个实例,改变某个实例中的静态变量,所有实例中的此变量都会改变,因为所有实例中的静态变量指向同一个内存
    因此改变类中静态变量只需:

    Entity::x = 1;
    Entity::y = 0;
    
  • 在编译阶段分配内存。

  • 类中的静态变量需在类外单独声明或初始化。

静态成员函数:

  • 若static修饰函数,静态函数只能访问静态变量,静态方法没有类实例。

    static void function(){}
    

局部静态

生命周期:整个程序

作用域:局部作用域

const

  • const修饰变量:变量的值不可改变。
const int a = 2;
//a = 10;	//const修饰变量后变量不可改变
  • **const修饰指针: **

    1. 常量指针:指针指向的内容不可改变。

      const int* p = &a;	//const int* p == int const* p
      //*p = 8;	//指针指向的内容不可改变
      
    2. 指针常量:指针的指向不可改变

      int* const p = &a;
      //p1 = &c;	//指针的指向不可改变
      
    3. 指向的内容和指向都不能改变。

      const int* const p = &a;
      
  • 常函数(只可在类中使用):const修饰后表示方法不会修改任何实际的类

    • 常函数内不可以修改成员属性

    • 成员属性声明时加关键字mutable后,在常函数中依然可以修改

      class Entity
      {
      private:mutable int m_X; int m_Y;
      public:int GetX()const	//表明该方法不会修改任何实际的类{m_X = 3;	//const修饰后不可改变,mutable修饰的变量除外return m_X;}
      };
      
  • 常对象:

    • 常对象只能调用常函数。

      const Entity e;
      

当成员函数的 const 和 non-const 版本同时存在时,const 对象只会调用 const 版本non-const 对象只会调用 non-const 版本

mutable

const修饰的方法可修改mutable修饰的变量。

动态内存new和delete

new

  • new关键字在堆上创建内存调用构造函数

    //两者的区别仅是new关键字还会调用构造函数
    Entity* e1 = new Entity();
    Entity* e2 = (Entity*)malloc(sizeof(Entity));
    
  • 若使用new[]来分配数组,需使用delete[]。

    int* b = new int[10];
    delete[] b;
    

placement new:

new (address) (type) initializer

  • placement new可以让对象在已知地址完成构造

    m_Data = static_cast<T*>(::operator new(sizeof(T) * size));
    new(m_Data + m_Size) T(value);	//在m_Data + m_Size的位置上构造一个T(value)
    
  • delete只能删除堆中分配的内存,所以placement new不能使用delete删除内存。

  • 可使用析构函数辅助删除。

    m_Data[i].~T();
    

delete

  • delete关键字在堆上删除内存调用析构函数

explicit

取消隐式转换,要求显式的调用构造函数。

auto

编译器自动转换成需要的类型。

constexpr

指示编译器在编译时计算表达式的值,并将其视为常量,可减小运行时的计算开销,提高程序的性能。

异常处理throw,try和catch

  • throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
  • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
  • try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。

语法:

try{// 保护代码
}
catch( ExceptionName e1 ){// catch 块
}
catch( ExceptionName eN ){// catch 块
}

如果 try 块在不同的情境下会抛出不同的异常,这个时候可以尝试罗列多个 catch 语句,用于捕获不同类型的异常。

抛出异常

throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。如:

throw "Division by zero condition!";	//抛出const char*类型的异常
throw std::out_of_range("out of range");	//抛出std::out_of_range类型的异常

捕获异常

catch 块跟在 try 块后面,用于捕获异常。可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。

try{// 保护代码
}
catch( ExceptionName e ){// 处理 ExceptionName 异常的代码
}
catch( ... )	//若想处理任何种类的异常,可使用(...)

C++ 标准的异常

C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常。它们是以父子类层次结构组织起来的,如下所示:
C++ 异常的层次结构

下表是对上面层次结构中出现的每个异常的说明:

异常 描述
std::exception 该异常是所有标准 C++ 异常的父类。
std::bad_alloc 该异常可以通过 new 抛出。
std::bad_cast 该异常可以通过 dynamic_cast 抛出。
std::bad_typeid 该异常可以通过 typeid 抛出。
std::bad_exception 这在处理 C++ 程序中无法预期的异常时非常有用。
std::logic_error 理论上可以通过读取代码来检测到的异常。
std::domain_error 当使用了一个无效的数学域时,会抛出该异常。
std::invalid_argument 当使用了无效的参数时,会抛出该异常。
std::length_error 当创建了太长的 std::string 时,会抛出该异常。
std::out_of_range 该异常可以通过方法抛出,例如 std::vector 和 std::bitset<>::operator
std::runtime_error 理论上不可以通过读取代码来检测到的异常。
std::overflow_error 当发生数学上溢时,会抛出该异常。
std::range_error 当尝试存储超出范围的值时,会抛出该异常。
std::underflow_error 当发生数学下溢时,会抛出该异常。

除了使用C++标准异常,还可通过继承和重载std::exception类来自定义异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/861047.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时序图

时序图(Sequence Diagram)是显示对象之间交互的图,这些对象是按时间顺序排列的。顺序图中显示的是参与交互的对象及其对象之间消息交互的顺序。时序图中包括的建模元素主要有:对象(Actor)、生命线(Lifeline)、控制焦点(Focus of control)、消息(Message)等等。 时序…

数据结构复习

背诵 线性表前驱:后继表长:空表:首元结点:头结点:头指针线性表的结构特点,除了第一个和最后一个元素外,每个节点都只有一个前驱和后继。线性表的存储方式:栈与队列顺序栈链栈链队列栈与队列存储数据栈的应用:循环列表判队空、队满条件,串串是一段有限长的字符序列,由…

java期末总结第二章

2.java编程基础 1.标识符与命名规范 标识符是给Java中的类、方法、变量、包命名的符号: 只能由字母、数字、下划线、美元符号组成,并且不能以数字开头。 Java标识符大小写敏感,长度无限制 标识符不可以是Java关键字和保留字 2.变量的定义和赋值 变量赋值语法如下: int a, b…

轻舟已撞大冰山

一、关于软工 1.1 想象和目标 在软工这门课正式开课之前,我早已听闻其威名。大二那年,看到学长学姐们为了软工课日日夜夜地开会,我心中对这门课的印象便牢牢地刻上了“麻烦”、“恐怖”、“费劲”这些字眼。甚至开始怀疑,一个学分的实践课,真的值得如此? 作为一个“只会考…

高性能计算-GPU编程模型(21)

1. GPU的内存模型 GPU编程数据需要从CPU主存拷贝到GPU全局存储器,所有线程共享全局存储。开辟的全局存储器空间指针在CPU代码中不能解引用使用,应在计算完结果后再拷贝回CPU主存空间。线程块内共享存储。 (1) 线程私有的存储有寄存器、本地内存 (2) 线程块内有块内线程共享的…

YEAH!!!

目录一.过往云烟1. 对于软件工程课程的想象2.在这门课程中的投入与产出3.印象最深刻的答辩二.果实1.故事2.新伙伴3.大提升软件工程真的是一门很不错的课程!如今也是轻舟已过万重山,但我永远怀念开发福小研的日子!!!三.致谢 一.过往云烟 1. 对于软件工程课程的想象“制作软…

【前端开发】代码上传前怎么避免把 账号,密码,AppId, key 之类私密信息 提交上去

平时我们写代码的时候难免会有一些私密信息不行提交到git仓库上去,比如 账号,密码,AppId, key 之类不希望公开的信息,但是提交代码难免会有疏漏的时候,对此我们可以写个 githook 来协助我们进行检查。 目的 在Git提交操作前,对即将提交的文件进行全面扫描,检查其中是否存…

已有的事后必再有

学期回顾 1.1 回顾对软件工程课程的想象 对软件工程的第一印象 最初,我对软件工程的理解非常肤浅,以为它只是一门普通的专业课程。然而,随着个人作业、结对作业和团队编程的深入,我深刻体会到了软件开发的巨大压力。 初步达到我的预期 在这三个月的学习实践中,我参与了需求…

秒杀场景的设计思考

秒杀场景的设计思考 在学习Redis的之后,一个绕不开的话题就是秒杀系统的设计。本文将从下面几个方面展开一下个人简单的理解:秒杀场景的介绍 设计的核心思路 怎么限流、削峰、异步 planB 总结‍ 秒杀场景的介绍 秒杀场景是大家常说的高并发场景,但是实际上其与单纯的高并发还…

UE4.27, 揣摩源码, 序列化 (三) FLinkerLoad, FLinkerSave

3. FLinkerLoad, FLinkerSave分别是UObject的反序列化和序列化的内核3.0. UPackage与UObjectUObject因为涉及与其他UObject的复杂引用关系,如果我们客制化地单独正反序列化每一个UObject,我们会在反序列化的时候惊觉这是繁琐而不可能的。为了满足UObject这种复杂的对象的序列…

设计Element UI表单组件居然如此简单!

0 前言 上文讲解了Jest框架对组件库测试,TypeScript和Jest都为代码质量和研发效率。之前实现Container和Button组件以渲染功能为主,可根据不同属性渲染不同样式去实现布局和不同格式的按钮。 本文的表单组件,除了要渲染页面组件,还支持很好页面交互,从Element3的表单组件开…

Kubernetes(v1.29)学习笔记

什么是KubernetesK8s是Kubernetes的简称,是一个开源的容器编排系统,用于自动部署、扩展和管理容器化应用程序。 Kubernetes源于希腊语,意为“舵手”或“飞行员”,其主要功能包括服务发现与负载均衡、存储编排、Secret和配置管理、批量执行、水平扩缩、自动化上线和回滚、自…