指针变量

C++ Primer 有感(异常处理)

心已入冬 提交于 2019-12-29 05:23:13
1.异常是通过抛出对象而引发的。 该对象的类型决定应该激活哪个处理代码 。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。 2.执行throw的时候, 不会执行跟在 throw 后面的语句,而是将控制从 throw 转移到匹配的 catch ,该 catch 可以是同一函数中局部的 catch ,也可以在直接或间接调用发生异常的函数的另一个函数中。 控制从一个地方传到另一地方,这有两个重要含义: (1)沿着调用链的函数提早退出。 (2)一般而言,在处理异常的时候, 抛出异常的块中的局部存储不存在了。 因为在处理异常的时候会释放局部存储,所以被抛出的对象就不能再局部存储,而是用 throw 表达式初始化一个称为异常对象的特殊对象。 异常对象由编译器管理,而且保证驻留在可能被激活的任意catch都可以访问的空间。这个对象由throw创建,并被初始化为被抛出的表达式的副本。异常对象将传给对应的catch,并且在完全处理了异常之后撤销。(异常对象通过复制被抛出表达式的结果创建,该结果必须是可以复制的类型。) 3.当抛出一个表达式的时候, 被抛出对象的静态编译时类型决定异常对象的类型 。 4.用抛出表达式抛出静态类型时,比较麻烦的一种情况是,在抛出中对指针解引用。对指针解引用的结果是一个对象,其类型与指针的类型匹配。如果指针指向继承层次中的一种类型

C++ Primer 有感(异常处理)

孤街浪徒 提交于 2019-12-29 05:22:52
1.异常是通过抛出对象而引发的。 该对象的类型决定应该激活哪个处理代码 。被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个。 2.执行throw的时候, 不会执行跟在 throw 后面的语句,而是将控制从 throw 转移到匹配的 catch ,该 catch 可以是同一函数中局部的 catch ,也可以在直接或间接调用发生异常的函数的另一个函数中。 控制从一个地方传到另一地方,这有两个重要含义: (1)沿着调用链的函数提早退出。 (2)一般而言,在处理异常的时候, 抛出异常的块中的局部存储不存在了。 因为在处理异常的时候会释放局部存储,所以被抛出的对象就不能再局部存储,而是用 throw 表达式初始化一个称为异常对象的特殊对象。 异常对象由编译器管理,而且保证驻留在可能被激活的任意catch都可以访问的空间。这个对象由throw创建,并被初始化为被抛出的表达式的副本。异常对象将传给对应的catch,并且在完全处理了异常之后撤销。(异常对象通过复制被抛出表达式的结果创建,该结果必须是可以复制的类型。) 3.当抛出一个表达式的时候, 被抛出对象的静态编译时类型决定异常对象的类型 。 4.用抛出表达式抛出静态类型时,比较麻烦的一种情况是,在抛出中对指针解引用。对指针解引用的结果是一个对象,其类型与指针的类型匹配。如果指针指向继承层次中的一种类型

C++之类和对象的使用(三)

本秂侑毒 提交于 2019-12-29 04:49:25
   对象数组 如果构造函数只有一个参数,在定义数组时可以直接在等号后面的花括号内提供。Student stud[3]={90,92,01};//合法 如果构造函数有多个参数,则不能用在定义时直接所提供所有实参的方法。 但可以如下定义: //构造函数有三个参数:学号,年龄,成绩 Student stud[3]{ Student(1000,19,22); Student(1001,19,22); Student(1002,19,22); };   对象指针 指向对象的指针 class Box {public: Box(int h=10,int w=10,int len=10); int s; int volume(); private: int height; int width; int length; }; Box::Box(int h,int w,int len) { height=h; width=w; length=len; } int Box::volume(){ return(height*width*length); }Box *ptr;//定义指向对象的指针Box t1;//定义Time类对象ptr=&t1;//将t1的起始地址赋给ptr 指向对象成员的指针 1)指向对象数据成员的指针 定义的一般形式为: 数据类型名 *指针变量名; int *p1; p1=&t1

C++文件读写详解(ofstream,ifstream,fstream)

删除回忆录丶 提交于 2019-12-29 04:44:35
C++文件读写详解(ofstream,ifstream,fstream)    这里主要是讨论fstream的内容: 1 #include <fstream> 2 ofstream //文件写操作 内存写入存储设备 3 ifstream //文件读操作,存储设备读区到内存中 4 fstream //读写操作,对打开的文件可进行读写操作 1、打开文件    在fstream类中,成员函数open()实现打开文件的操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件的读写操作    函数:open() 1 public member function 2 3 void open ( const char * filename, 4 ios_base::openmode mode = ios_base::in | ios_base::out ); 5 6 void open(const wchar_t *_Filename, 7 ios_base::openmode mode= ios_base::in | ios_base::out, 8 int prot = ios_base::_Openprot); 9 /* 10 参数:filename 操作文件名 11 mode 打开文件的方式 12 prot 打开文件的属性 //基本很少用到

C++文件操作详解(ifstream、ofstream、fstream)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-29 04:44:17
C++ 文件操作详解( ifstream 、 ofstream 、 fstream ) C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstream: 可同时读写操作的文件类 (由iostream引申而来) 打开文件 (Open a file) 对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示 (这些类的一个实例) ,而对这个流对象所做的任何输入输出操作实际就是对该文件所做的操作。 要通过一个流对象打开一个文件,我们使用它的成员函数open(): void open (const char * filename, openmode mode); 这里filename 是一个字符串,代表要打开的文件名,mode 是以下标志符的一个组合: ios::in 为输入(读)而打开文件 ios::out 为输出(写)而打开文件 ios::ate 初始位置:文件尾 ios::app 所有输出附加在文件末尾 ios::trunc 如果文件已存在则先删除该文件 ios::binary 二进制方式 这些标识符可以被组合使用,中间以”或”操作符(|

C#内存管理与垃圾回收

核能气质少年 提交于 2019-12-29 02:32:45
垃圾回收还得从根说起,就像生儿育女一样。 根 :根是一个位置,存放一个指针,该指针指向托管堆中的一个对象,或是一个空指针不指向任何对象,即为null。根存在线程栈或托管堆中,大部分的跟都在线程栈上,因为定义的变量就存在线程栈上,类型对象指针存在托管堆中,因为实例化一个对象要额外分配两个字段“类型对象指针”和“同步块索引”。 类型对象指针的作用 。实例化一个对象并没有为其方法分配内存,类型的静态字段分配内存,而实例要向调用属于类型的一些东西,就必须通过类型对象指针。如对象的实例是共用类型的方法,实例只需要通过类型对象指针调用类型的方法,更多关于方法的调用请看我的 这篇博客 。 同步块索引的作用 。1:用于lock,使对象在同一时刻只能一个线程访问;2:用于获取对象的hashCode;3:在垃圾回收时标志某个对象是否是垃圾。关于 lock 最经典的一个例子就是单例了,大家的实现都是实例化一个object对象,然后锁住它,然后在判断是否要实例要实现单例的那个对象。我们为什么要实例化一个object,而不是直接lock(typeof(object)),那是因为这样会把object这个类型给锁住,锁住期间,任何使用线程使用lock(typeof(object))就必须等待,object还是可以正常使用。lock能起到单线程访问的原因是:它里面有一个空的for死循环

A Tour to LLVM IR

百般思念 提交于 2019-12-28 17:12:28
https://zhuanlan.zhihu.com/p/66793637 https://zhuanlan.zhihu.com/p/66909226 内容概要 什么是LLVM IR?如何得到IR? LLVM编译的流程,IR文件之间的链接简介 C++ name mangling的用途,“extern C"作用的极简介绍 IR文件的布局 IR中函数定义的结构,什么是BB,什么是CFG IR是一个强类型语言,如何用工具检查IR的合法性 如何理解 Language reference 常见的terminator instruction介绍 如何利用工具得到函数的CFG 什么是SSA?SSA的好处和问题,以及如何解决这个问题 参考文献 what is tail reursion make clang compile to ll -cc1的含义 clang和clang++的区别 what is a linkage unit? LLVM LanguageRef extern "C"的作用 what is name mangling what is static single assignment? what is reaching definition? 1. 什么是LLVM IR? LLVM IR 是 LLVM Intermediate Representation,它是一种 low

【iOS面试系列-1】iOS中@property 后assign,copy,retain,weak,strong的意义与区别(必考-必须详细掌握)

帅比萌擦擦* 提交于 2019-12-28 14:04:11
来源:网络 assign : 普通(简单)赋值,一般常用于基本数据类型,常见委托设计模式,一次来防止循环引用。不更改索引计数(Reference Counting)。 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等) retain :保留计数,获得到了对象的所有权,引用计数在原有基础上+1.释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 。我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到 2。这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。retain之后count加一。alloc之后count就是1,release就会调用dealloc销毁这个对象。如果 retain,需要release两次。通常在method中把参数赋给成员变量时需要retain。NSArray对象会retain(retain值加一)任何数组中的对象。当NSArray被卸载(dealloc)的时候,所有数组中的对象会 被 执行一次释放(retain值减一)。不仅仅是NSArray,任何收集类(Collection

动态内存与智能指针

*爱你&永不变心* 提交于 2019-12-27 21:37:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前言 1.生命周期 全局对象: 程序启动时分配,程序结束时销毁 局部自动对象: 执行流进入其定义的块时分配,执行流退出其定义的块时销毁 局部static对象: 程序启动时分配(但在其定义的块或作用域内起作用),程序结束时销毁 动态分配的对象: 生命周期与创建地点无关,只有当显示的被释放时,才会被销毁 智能指针:标准库定义,用于管理动态分配的内存,当一个对象应该被释放时,指向它的智能指针可以确保自动的释放它 2.内存分类 静态内存: 用于存储局部static对象、类的static数据成员、全局变量 栈内存: 用于存储局部非static对象 堆内存(内存池): 用于存储动态分配的对象——动态分配的对象,其生命周期由程序控制,例如使用new或delete 3.动态内存 动态内存使用过程中容易产生的问题 内存泄露: 使用后忘记释放内存 引用非法内存: 在尚有指针引用内存的情况下就释放它 使用动态内存的原因: 程序不知道自己需要使用多少对象 程序不知道所需对象的准确类型 程序需要在多个对象间共享底层数据——若两个对象共享底层数据,当某个对象销毁时,我们不能单方面的销毁底层数据 4.智能指针 智能指针和常规指针直接的区别:智能指针能够自动释放所指向的内存(类似java中的垃圾回收机制),而常规指针不能。

Chromium的智能指针/引用计数/Callback/Bind

风格不统一 提交于 2019-12-27 21:35:00
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 这四个东西对使用者来说不难,看懂代码注释里的例子即可,预计1小时左右看懂全部。要去理解其设计思想的话最需要掌握的是模板类的使用,但一般使用者完全不用关心怎么设计的。 使用者的学习路径: 1.智能删除指针scoped_ptr 用作对普通指针的转储,防止忘记delete或不知道哪里delete。它跟引用计数没有关系。 头文件的注释就是使用示例 http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_ptr.h template <class T, class D = base::DefaultDeleter<T> > class scoped_ptr 其中Deleter可以被替换,默认的Deleter区分是要delete普通指针还是指针数组,或者用free函数删除malloc的内存。 2. ScopedVector http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_vector.h 在析构时会delete其元素的vector,知道它的行为即可。 3.带引用计数的类 http://src.chromium.org/viewvc/chrome/trunk