首页天道酬勤c++运算符的优先级(C语言运算符)

c++运算符的优先级(C语言运算符)

admin 12-01 07:10 211次浏览

本期是《C基础语法分享》的第九节。今天,我就和大家分享一下:

(1)智能指针;

(2)强制类型转换运算符;

(3)运行时类型信息(RTTI);

00-1010c标准库(STL)

头文件:#包括内存

C 98:

STD : auto _ ptrstd 33603360 string PS(新STD :3360 string(str));C 11:

共享_ptr

唯一_ptr

弱_ptr

Auto_ptr(被C 11否决)

Class _ ptr实现了共享所有权的概念。多个智能指针指向同一个对象,当最后一个引用被销毁时,该对象及其相关资源将被释放。为了在复杂的场景中执行上述工作,标准库提供了weak_ptr、bad_weak_ptr和enable_shared_from_this等辅助类。

Class unique_ptr实现了独占所有权或严格所有权的概念,并确保只有一个智能指针可以同时指向该对象。你可以转让所有权。这对于避免内存泄漏——特别有用,例如新建和忘记删除——。

00-1010智能指针可以共享同一个对象,最后一个对象有责任销毁该对象并清理与该对象相关的所有资源。

支持自定义删除器,可以防止跨DLL问题(对象由动态链接库(DLL)中的new创建,但被另一个DLL中的delete破坏)和自动解锁互斥。

00-1010 weak_ptr允许您共享但不拥有对象。一旦拥有该对象的最后一个智能指针失去其所有权,任何weak _ ptr都将自动变为空。因此,除了默认构造函数和复制构造函数之外,weak_ptr只提供接受shared_ptr的构造函数。

它可以打破引用循环的问题(两个没有使用过的对象实际上是相互引用的,使它们看起来仍然处于“使用过”的状态)。

00-1010 unique _ ptr是C 11开始提供的类型,它是一个智能指针,在异常情况下可以帮助避免资源泄露。独占所有权意味着它可以确保一个对象及其对应的资源同时只归一个指针所有。一旦你拥有被破坏的或被编程为空的,或者开始拥有另一个对象,先前拥有的对象将被破坏,任何相应的资源将被释放。

Unique_ptr用于替换auto_ptr。

00-1010被c 11放弃,因为缺乏语言特性,如std:move用于构造和赋值的move语义,以及其他缺陷。

00-1010 auto _ ptr可以分配副本,副本后所有权会转移;unxuee _ ptr没有复制赋值语义,但实现了移动语义;

Auto_ptr对象不能管理数组(销毁调用delete),而unique_ptr可以管理数组(销毁调用delete[]);

智能指针

静态_cast

对于非多态类型的转换

不执行运行时类型检查(转换安全性不如dynamic_cast)

通常用于转换数字数据类型(如浮点型)

您可以在整个类层次中移动指针,将子类转换为父类是安全的(向上转换),将父类转换为子类是不安全的(因为子类可能有不在父类中的字段或方法)。

上变频是一种隐式转换。

动态强制转换

用于多态类型的转换。

对行执行运行时类型检查。

仅适用于指针或引用。

不明确指针的转换将失败(返回nullptr),但不会引发异常。

您可以在整个类层次结构中移动指针,包括向上转换和向下转换。

const_cast

用于删除常量、易失性和__未对齐的属性(例如将常量int类型转换为int类型)

reinte

rpret_cast

用于位的简单重新解释

滥用 reinterpret_cast 运算符可能很容易带来风险。 除非所需转换本身是低级别的,否则应使用其他强制转换运算符之一。

允许将任何指针转换为任何其他指针类型(如 char* 到 int* 或 One_class* 到 Unrelated_class* 之类的转换,但其本身并不安全)

也允许将任何整数类型转换为任何指针类型以及反向转换。

reinterpret_cast 运算符不能丢掉 const、volatile 或 __unaligned 特性。

reinterpret_cast 的一个实际用途是在哈希函数中,即,通过让两个不同的值几乎不以相同的索引结尾的方式将值映射到索引。

bad_cast

由于强制转换为引用类型失败,dynamic_cast 运算符引发 bad_cast 异常。

bad_cast 使用

try { Circle& ref_circle = dynamic_cast<Circle&>(ref_shape); } catch (bad_cast b) { cout << "Caught: " << b.what(); }

运行时类型信息 (RTTI)

dynamic_cast

用于多态类型的转换

typeid

typeid 运算符允许在运行时确定对象的类型

type_id 返回一个 type_info 对象的引用

如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数

只能获取对象的实际类型

type_info

type_info 类描述编译器在程序中生成的类型信息。 此类的对象可以有效存储指向类型的名称的指针。 type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序的编码值。 类型的编码规则和排列顺序是未指定的,并且可能因程序而异。

头文件:typeinfo

typeid、type_info 使用

#include <iostream> using namespace std; class Flyable // 能飞的 { public: virtual void takeoff() = 0; // 起飞 virtual void land() = 0; // 降落 }; class Bird : public Flyable // 鸟 { public: void foraging() {...} // 觅食 virtual void takeoff() {...} virtual void land() {...} virtual ~Bird(){} }; class Plane : public Flyable // 飞机 { public: void carry() {...} // 运输 virtual void takeoff() {...} virtual void land() {...} }; class type_info { public: const char* name() const; bool operator == (const type_info & rhs) const; bool operator != (const type_info & rhs) const; int before(const type_info & rhs) const; virtual ~type_info(); private: ... }; void doSomething(Flyable *obj) // 做些事情 { obj->takeoff(); cout << typeid(*obj).name() << endl; // 输出传入对象类型("class Bird" or "class Plane") if(typeid(*obj) == typeid(Bird)) // 判断对象类型 { Bird *bird = dynamic_cast<Bird *>(obj); // 对象转化 bird->foraging(); } obj->land(); } int main(){ Bird *b = new Bird(); doSomething(b); delete b; b = nullptr; return 0; }

今天的分享就到这里了,大家要好好学C++哟~

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编程学习书籍分享:

编程学习视频分享:

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

168飞艇6种不亏钱的方法class Flyable // 能飞的 { public: virtual void takeoff() = 0; // 起飞 virtual void land() = 0; // 降落 }; class Bird : public Flyable // 鸟 { public: void foraging() {...} // 觅食 virtual void takeoff() {...} virtual void land() {...} virtual ~Bird(){} }; class Plane : public Flyable // 飞机 { public: void carry() {...} // 运输 virtual void takeoff() {...} virtual void land() {...} }; class type_info { public: const char* name() const; bool operator == (const type_info & rhs) const; bool operator != (const type_info & rhs) const; int before(const type_info & rhs) const; virtual ~type_info(); private: ... }; void doSomething(Flyable *obj) // 做些事情 { obj->takeoff(); cout << typeid(*obj).name() << endl; // 输出传入对象类型("class Bird" or "class Plane") if(typeid(*obj) == typeid(Bird)) // 判断对象类型 { Bird *bird = dynamic_cast<Bird *>(obj); // 对象转化 bird->foraging(); } obj->land(); } int main(){ Bird *b = new Bird(); doSomething(b); delete b; b = nullptr; return 0; }

今天的分享就到这里了,大家要好好学C++哟~

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编程学习书籍分享:

编程学习视频分享:

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

node_modules/@angular/cdk/table“'没有导出的成员'CdkTextColumn'瘦长按Ubuntu Server 输入sudo 指令不使用密码如何使用Ionic4创建手风琴列表?【容器云 UK8S】使用必读:授权给UK8S云产品的管理权限
it工程师(ie工程师是做什么的) 面试a轮b轮c轮区别(面试官在简历上写c)
相关内容