首页 > 编程语言 >C++关键字

C++关键字

时间:2024-12-29 22:29:48浏览次数:1  
标签:std const int C++ 关键字 catch new 异常

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类来自定义异常。

标签:std,const,int,C++,关键字,catch,new,异常
From: https://www.cnblogs.com/wsdanshenmiao/p/18639715

相关文章

  • C++标准库
        【欢迎关注编码小哥,学习更多实用的编程方法和技巧】    C++标准库是C++语言的重要组成部分,它为程序员提供了一系列的功能强大的工具和组件,帮助他们更高效地进行软件开发。标准库不仅包括基本的输入输出功能,还涵盖了数据结构、算法、内存管理、日期和时间处......
  • c++《射击小游戏》
    #include<easyx.h>#include<time.h>#include<conio.h>classBullet;classTank;classE_Bullet;classBoss;booldead=false;boolwined=false;structpos//坐标类{inta;intb;};classE_Bullet//敌人打出的子弹{public:clock_td;in......
  • 【C++动态规划】1105. 填充书架|2104
    本文涉及知识点下载及打开打包代码的方法兼述单元测试C++动态规划LeetCode1105.填充书架给定一个数组books,其中books[i]=[thicknessi,heighti]表示第i本书的厚度和高度。你也会得到一个整数shelfWidth。按顺序将这些书摆放到总宽度为shelfWidth的书架上......
  • while循环——c++新手必学第四课
    在学第二课时,我们讲过for循环加上if判断就能循环判断,相当于while。所以,不言而喻,while循环的功能就是循环判断。文章目录一、while循环是什么?二、使用示例1.基本用法总结一、while循环是什么?while循环就是循环判断,也就是if加for的快捷方式。二、使用示例1.......
  • C++ 电子学会二级2024年12月部分考题答案
    1、逆行描述:网上有个段子说:妻子在家听广播,听到某高速路上有一辆车在逆行,想到丈夫在那条高速上行驶,就打电话对丈夫说:“老公啊,你走的那条高速上有一辆车在逆行,你小心点。”她丈夫说:“何止啊!我看好几百辆车都在逆行!”现在我们查了一下高速公路上拍到的好几百辆车的时速,发现有......
  • C++经典面试题50道!!!(秋招必备)
    往期回顾:【QT入门】Qt槽函数五种常用写法介绍-CSDN博客【QT入门】QListWidget各种常见用法详解之列表模式-CSDN博客【QT入门】Qt自定义控件与样式设计之QPushButton常用qss_qpushbuttonqss-CSDN博客50道资源完整版:https://download.csdn.net/download/LF__plus/902......
  • C++异常处理机制学习(持续更新)
    具体的异常要回去学中断这些,我打算到时候再细致研究,故而这里只是粗浅地讨论C++的异常处理机制.(其实没太看懂原理和应用的关系,以后还要深入研究)首先我们要探究一下seh异常处理机制,从与其相关的数据结构讲起.TIB结构TIB(ThreadInfoimationBlock,线程信息块)是保存线程......
  • c++11新特性
    智能指针1.管理内存释放问题2.共享所有权和转移//用的最多,内涵一个指向计数器,计数器归0的时候,释放对应的内存//指针本身在栈里面存储,指向的内容是放在堆里面的,栈可以自动释放,堆不可以shared_ptr//检测内存有没有被释放,被释放了就不用了,没被释放才做一些操作weak_ptr//纯......
  • 引用与常量 - 引用类型、const关键字
    引言在C++中,引用和const关键字是两个非常重要的概念。引用提供了一种方便的方式来操作变量的别名,而const关键字则用于定义不可修改的常量或指针。正确理解和使用这两个特性可以提高代码的安全性和可读性。本文将详细介绍引用的基本概念和操作,以及const关键字的各种用法,帮助初......
  • C++(getchar())
    目录1.函数原型2.功能3.常见用法4.与getchar()的区别5.处理输入错误6.注意事项7.总结getchar()是C和C++中的一个标准输入函数,定义在头文件<cstdio>或<stdio.h>中。它用于从标准输入流(通常是键盘)读取一个字符。1.函数原型intgetchar(void);返回值:成......