我的C++学习笔记

合集下载

领悟《中华人民共和国食品安全法》的学习笔记

领悟《中华人民共和国食品安全法》的学习笔记

领悟《中华人民共和国食品安全法》的学习笔记引言《中华人民共和国食品安全法》是中国国家层面的一部食品安全相关的法律法规。

通过学习这部法律,我对中国食品安全管理体系有了更深入的了解。

以下是我的学习笔记:法律的目的和适用范围- 《中华人民共和国食品安全法》的主要目的是保障人民群众的食品安全,维护公众的健康权益。

- 该法律适用于在中国境内生产、加工、储存、运输、销售、餐饮等环节涉及的食品安全问题。

食品安全责任制- 《中华人民共和国食品安全法》明确了食品安全责任制的原则和要求。

- 食品生产经营者应当建立健全食品安全管理制度,承担相应的食品安全责任。

- 各级政府应当加强对食品安全工作的监督和管理,确保食品安全工作的顺利进行。

食品安全监管措施- 《中华人民共和国食品安全法》规定了一系列食品安全监管措施。

- 食品安全监督管理部门应当加强对食品生产、流通、餐饮等环节的监督检查,发现问题及时处理。

- 对于存在食品安全风险的产品,食品安全监督管理部门有权采取相应的措施,如责令停产停业、查封场所等。

食品安全信息公开- 《中华人民共和国食品安全法》强调了食品安全信息公开的重要性。

- 食品安全监督管理部门应当及时公开食品安全信息,向公众发布食品安全警示信息。

- 各级政府应当加强食品安全宣传教育,提高公众的食品安全意识。

食品安全违法行为和处罚- 《中华人民共和国食品安全法》对食品安全违法行为和处罚做出了明确规定。

- 对于违法生产、销售不符合食品安全标准的食品的行为,将依法给予处罚,包括罚款、责令停产停业等。

- 对于严重违法行为,还可追究刑事责任。

结论《中华人民共和国食品安全法》是中国食品安全管理的基础性法律,它为保障人民群众的食品安全权益提供了法律保障和监管措施。

通过学习这部法律,我对食品安全管理体系有了更全面的认识,将在未来的实践中更加注重食品安全,维护公众的健康权益。

作文《我的数学学习笔记》

作文《我的数学学习笔记》

我的数学学习笔记 我的数学学习笔记?哈哈,说笔记有点夸张了,其实就是我那本被各种涂鸦和零食碎屑“装饰”的笔记本啦!就说最近吧,我正对着二次函数抓狂呢,那玩意儿,简直就像个调皮捣蛋的小精灵,一会儿往上窜,一会儿往下掉,完全捉摸不透它的脾气!

那天晚上,我妈做了我最爱的糖醋排骨,香气简直能把人鼻子勾走!我一边啃排骨一边看题,嘴里还哼哼唧唧呢,哎,这抛物线怎么就过不了那个点呢?我啃着排骨,顺手就在本子上画了个抛物线,嗯,像不像我啃完排骨后剩下的骨头…弯弯曲曲的,还带着点油渍,突然,灵光一闪!你看啊,这抛物线就像我啃排骨一样,先从低处开始, 慢慢往上“爬”,爬到最高点(也就是顶点啦,我终于理解了顶点了!)之后,就又开始往下“滑”了,对不对?

我这排骨啃得,那叫一个认真细致!这排骨啊,先煎了一下,外皮焦黄焦黄的,酥脆又香,里面肉质还嫩,一咬下去,汁水就爆出来了,啧啧,真好吃!然后,这糖醋汁儿,酸甜可口,裹在排骨上,色泽亮晶晶的,像极了那道题里画出来的抛物线的曲线,特别诱人。 我一边吃,一边琢磨,这抛物线的最值点,是不是就相当于这排骨最香、最酥脆、汁水最足的那一口啊? 我当时就想啊,要是能把这感觉写进我的数学笔记就好了,估计老师也想不到吧? 我琢磨着琢磨着,觉得好像有点道理。 对啊,这抛物线图像,就好像描述了排骨美味程度的变化过程,从煎到糖醋,到最终在我嘴巴里达到美味的顶峰…然后就…吃完了,也就没有了。 我突然发现,那些公式,那些枯燥的符号,居然能和这美味的糖醋排骨联系起来! 这二次函数的图像,不就像我吃排骨的过程么?从开始的期待,到中间的享受,再到最后的回味,充满了变化和乐趣!

所以啊,我的数学学习笔记,比起什么严谨的推导,更多的,是各种奇奇怪怪的涂鸦,还有我吃零食的痕迹。不过呢,这些涂鸦和零食碎屑,其实也记录了我学习数学的心路历程嘛,充满了,嗯… 怎么说呢,充满了吃货的智慧? 反正,下次再遇到难题,我打算先去吃点好吃的,说不定就能找到灵感了呢!哈哈!

DVB-C学习笔记

DVB-C学习笔记

一1,TS流,我们最长听到的词,他是由TS包组成,TS包为188字节(204字节,比188多了16字节的CRC数据)的分组。

2,TS包由4字节的包头,(适应字段),(有效负载),(填充字节)等四部分组成,带括号的3个是有可能有也有可能没有的。

有无适应字段可以通过adaption_field_control字段判断,该字段同样可以判断有无有效负载。

有无填充字节(填充字节必为FF)只能依靠section_length来判断。

有效数据结束以后,TS包还未满时,使用填充字节补满188字节。

3,TS包中容易引起误会的也只有pay_load_unit_start_indicator,即有效负载数据单元其实指示符字段。

该标志表示是否有一个PES 分组,或者PSI表开始于本TS包,即本TS包的有效数据是不是一个PES包的开始,或者一个PSI表的开始。

如果是则为1. 还有人问如何知道一个包是PES包,还是PSI信息,这个单独一个包是没法知道的,必须先解析PAT,PMT,得到PSI表的PID之后才可以知道。

如果该包是PSI表信息,并且pay_load_unit_start_indicator = 1,则有效数据的第一个字节为point_field字段,即有效负载的偏移指针。

4,PAT表的PID固定为0x00,它的作用为:将节目号码与PMT PID相关联。

PAT表的有效信息有:program_number,network_pid/program_map_pid.当program_number = 0 时,其后跟随的PID就为网络PID,否则则为PMT PID.5,如果TS流中有一个或多个节目被加扰,那么PSI中就必须有一个CAT表。

CAT表的PID也是固定的值,为0x01,表中包含与加扰流相关联的CA_descriptor.二(PMT program_map_table)1,PMT给出了节目号码和组成节目的各元素(音视频ES流)之间的映射。

sqlite学习笔记8:C语言中使用sqlite之创建表

sqlite学习笔记8:C语言中使用sqlite之创建表

sqlite学习笔记8:C语⾔中使⽤sqlite之创建表前⾯已经说了怎样打开和关闭数据库,这次要说得是怎样运⾏SQL语句,来创建⼀张表。

要⽤的的函数:sqlite3_exec(sqlite3* db, const char *sql, sqlite_callback callback, void *data, char **errmsg)參数:db:已经打开的数据库实例sql:SQL语句,是⼀个字符串callback:是⼀个回调函数data:做为回调函数的第⼀个參数errmsg:⽤于带回错误信息该回调函数有两种返回值类型.1.返回零:sqlite3_exec() 将继续运⾏查询.2.返回⾮零:sqlite3_exec()将马上中断查询, 且 sqlite3_exec() 将返回 SQLITE_ABORT.回调函数的格式例如以下:int sqlite_callback(void* pv, /* 由 sqlite3_exec() 的第四个參数传递⽽来 */int argc, /* 表的列数 */char** argv, /* 指向查询结果的指针数组, 能够由 sqlite3_column_text() 得到 */char** col /* 指向表头名的指针数组, 能够由 sqlite3_column_name() 得到 */);參数格式:传给sqlite3_exec的回调函数,⽤来显⽰查询结果对每⼀条查询结果调⽤⼀次该回调函数參数:pv:由sqlite3_exec传递的初始化參数argc:表头的列数col:表头的名字数组指针argv:表头的数据数组指针返回值:1:中断查找0:继续列举查询到的数据实例:#include <stdio.h>#include <stdlib.h>#include "sqlite/sqlite3.h"#define DB_NANE "sqlite/test.db"sqlite3 *db = NULL;char* sql = NULL;char *zErrMsg = NULL;int ret = 0;typedef enum{false,true} bool;static int callback(void *NotUsed, int argc, char **argv, char **azColName){int i = 0;for(i=0; i < argc; i++){printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;}bool connectDB(){ret = sqlite3_open(DB_NANE, &db);if( ret != SQLITE_OK){fprintf(stderr, "Error open database: %s\n", sqlite3_errmsg(db));sqlite3_free(zErrMsg);return false;}fprintf(stdout, "Successfully opened database\n");return true;}/* 相对于前篇⽂章加⼊了这个函数 */bool createTable(){/* Create SQL statement */sql = "CREATE TABLE COMPANY(" \"ID INT PRIMARY KEY NOT NULL," \"NAME TEXT NOT NULL," \"AGE INT NOT NULL," \"ADDRESS CHAR(50)," \"SALARY REAL );";/* Execute SQL statement */ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if( ret != SQLITE_OK ){fprintf(stderr, "Error SQL: %s\n", zErrMsg);sqlite3_free(zErrMsg);return false;}fprintf(stdout, "Successfully table created\n");return true;}bool closeDB(){int ret = 0;ret = sqlite3_close(db);if ( ret == SQLITE_BUSY ){return false;}return true;}int main(int argc, char* argv[]){connectDB();createTable();/*添加了⼀个函数调⽤*/closeDB();return 0;}这个函数仅仅能运⾏⼀次,第⼆次运⾏会报错说表已经存在。

英语学习笔记(13)

英语学习笔记(13)

英语学习笔记(13)1、单辅音C和G发音所对应的特殊关系soft/hard字母C的发音有两个,分别是/k/、/s/。

Hɑrd C = /k/,在胖元音前发/K/。

Soft C = /s/,在瘦元音前发/S/。

其他情况下也发/k/ 什么叫胖元音,什么叫瘦元音?a,o,u就是胖元音;e,i,y就是瘦元音。

是不是很形象。

字母g也有两个发音,分别是/g/、/dʒ/。

Hɑrd G = /g/,在胖元音前发/g/。

Soft G = /dʒ/,在瘦元音前发/g/。

其他情况下也发/k/再补充一个元音i的特殊发音:2、相同发音的辅音组合规则/k/ c=k=ck=que=ch=q/f/ f=ph/s/ s=sc/z/ z=s/ʧ/ ch=tch 读,如Chi'na, much;catch, match/f/ ph=gh 读,如pho'to, phone/ʤ/ dg=dj 读,如judge,lodg'ing;adjust',ad'jectivech发音为/k/主要是一些源于希腊的单词。

在希腊文中ch等于k,发音也是/k/。

比如:schedule,scholar,mechanic,chemical,architect,technical,chorus,echo,christ,christmsa,ache,chaos,choir,character,orchid。

来自法语单词中,ch发音为/ʃ/,比如:machine,chef,chalet。

来自波斯单词中,ch发音为/dʒ/,比如:spinach。

关于g的发音区别,其实和上述第一条的soft、hard音是一个规则,在瘦元音之前,g的发音都是/dʒ/。

3、不发音的辅音汇总辅音的发音本身规则很少,很简单。

但是往往会有些小陷阱,比如在一些字母组合中,常常会有一个不发音的辅音偷偷藏着,这个时候就绝对不能遵循自然拼读的规则。

为了一口纯正的英语口语,一定要牢记不发音的辅音规则。

学习笔记_cshell

学习笔记_cshell

1.基本命令2.表达式表达式可由常量、变量和以下运算符组成,其中部分是涉及文件而不是数值表达式遵守以下规则:1)shell将丢失参数或零参数看作是0;2)所有的结果都是十进制数;3)除了!=和==外,运算符的参数都是数字;4)用户必须将表达式的每个元素与比邻的元素用空格分开,除非相邻元素是&、/、<、>等。

3.shel变量格式序列结果%U 命令运行用户代码所消耗的时间,单位是C P U秒(用户模式)%S 命令运行系统代码所消耗的时间,单位是C P U秒(核心模式)%E 命令所消耗的Wa l l时钟时间(整个时间)%P 任务周期内C P U所耗费的时间百分比,按照( % U + % S ) / % E计算%W 命令进程交换到磁盘的次数%X 命令使用的平均共享代码内存量,单位是千字节%D 命令使用的数据代码内存量,单位是千字节%K 命令使用整个内存内存量,就是% X + % D,单位是千字节%M 命令使用的最大内存量,单位是千字节%F 主页错误数(不得不脱离磁盘读取的内存页)%I 输入操作数%O 输出操作数作为开头的shell变量4.控制结构if(expression) simple-command只对简单命令起作用,对管道或命令列表无效。

可以用if….then控制结构来执行更复杂的命令除逻辑表达式外,用户可以用表达式来返回基于文件状态的值如下:如果指定的文件不存在或不可访问,csh将表达式的值算作0。

否则如果测试结果是true,则表达式的值为1;如果为false,则表达式的值为0。

goto labelgoto命令将控制传送给开始于label的表达式。

onintr label中断处理当用户在脚本执行过程中按下中断键,shell将把控制传递给以label:开始的语句。

该语句可以让用户在其被中断时正常终止脚本。

if…then…else形式1if(expression) thencommandsendif形式2if(expression) thencommandselsecommandsendif形式3if(expresstion) thencommandselse if(expresstion) thencommands...elsecommandsendifforeachforeach loop-index(argument-list)commandsendwhilewhile(expresstion)commandsendbreak/continue可以用break中断foreach或while,这些语句在传递控制前执行命令行中剩下的命令。

我的书法学习笔记

我的书法学习笔记每一个人都有自己喜欢的东西,有些人喜欢音乐,有些人喜欢绘画,而我则喜欢书法。

从小就喜欢看到书法作品,欣赏优美的字体,慢慢地也想学习书法了。

下面我就来分享以下我的书法学习笔记。

一、初识书法最开始我是从观看书法作品入手,欣赏袁宏道、米芾等书法家的作品。

书法家们的作品让我感觉到字体可以如此美妙,当时的我就萌发了学习书法的想法。

于是我开始向书法家请教,想寻求学习的建议。

书法家告诉我:学习书法最重要的是手写,而且要从基础的毛笔字开始学习。

二、毛笔字的练习书法的基础技能是毛笔字,因此我开始进行毛笔字的练习。

首先是墨汁的准备,书法家给我讲解了怎样调墨汁、如何控制笔触等。

接下来则是字体的练习,书法家告诉我要从简单的一笔一画的字开始练习,比如“一”、“丨”、“口”等等。

因为这些字简单,容易上手,也能让我初步了解毛笔的基本控制技能。

这一阶段的训练时间很长,我反复练习单个字,直到笔画方向和力度准确无误。

三、学习行书通过毛笔字的练习,我可以确保我的字写得规范,书写者的姿势正确,并且掌握了基本的书写技巧。

接下来我开始练习行书,通过行书的练习,我可以使我的笔画变得更流畅,更优美。

跟随书法家的指导,我从小篆、隶书、楷书等基础字开始练习,渐渐地,我还学习了很多书法家的写法,逐渐形成了自己的风格。

四、独立创作接下来,我开始进行独立创作。

在此之前,我已经掌握了毛笔字的基本技巧以及行书的写法。

从此,我可以自己构思一些行书的作品,写下一些自己的感悟和理解。

在这个过程中,我也找到了自己的书法风格,逐渐形成了属于我自己的书法作品。

五、学以致用书法不仅仅是一种练习技巧的艺术,它也可以变成一种实用的技能。

当我能够写出助记符号、各种表格时,我发现书法的价值不仅仅在于艺术上,而且在很多有用的实际情况中也是有用的。

除了写行书之外,我还可以利用它来写信、写稿等等。

六、推广书法文化作为爱好书法的人,我也想将书法艺术推广给更多的人。

我在朋友圈中经常发布一些我的书法作品,并在微博、微信等其他平台上分享我的经验和技巧。

党员学习笔记范文

党员学习笔记范文下面是小编为你们整理的几篇文章,希望你们喜欢阅读。

党员学习笔记时间:xx月xx日xx点地点:家中学习形式:个人学习学习资料:《党史》中国共产党自1921年成立以来,为了求得民族独立和人民解放,实现国家的繁荣富强和人民的共同富裕,已经风风雨雨的走过了90年艰辛而辉煌的历程。

从“第一次国共合作破产”开始到”十年动乱”,党的发展历尽艰辛,挫折与前进是共同存在的。

正是由于这些挫折,中国共产党才积累了极其丰富的经验,其归结到一点,就是把马克思列宁主义同中国革命和建设的具体实际相结合,走具有中国特色的社会主义发展道路。

随着时代的发展,在以邓小平为核心的党中央又提出了新的理论――邓小平理论。

他把马克思基本原理同中国实际和时代特征相结合起来,继承并发展了毛泽东思想。

在这个理论的指导下,构成了以经济建设为中心、坚持四项基本原则、坚持改革开放的党在社会主义初级阶段的基本路线,确立了中国实现社会主义现代化的正确道路。

历史是过去传到将来的回声,是将来对过去的反映。

学好党的历史,了解过去才能把握这天,把握这天才能创造明天。

从革命前辈的手里接过历史的接力棒,我们这代人要做好承上启下的历史任务,不断持续和发扬党的胜利成果。

党的历史像一条河流,曲折但是坚定地向着一个方向流动。

穿行在90年的历史长河,点点滴滴都闪烁着耀眼的光辉。

我会一向坚定不移的拥护党的领导,要做这长河中的一滴水,任他洪水猛兽还是壁立千仞都无所畏惧、坚定不移!党员学习笔记时间:2016年3月15日地点:乡会议室学习资料:学习党章党章是党的最基本性的纲领文件,代表了全党的根本利益和意志,集中体现了党员先进性的基本要求,是党员和党的领导干部,个性是我们入党积极分子务必遵守的基本准则。

透过学习新党章,进一步了解国家重大事件和对党的重大决策,更加深刻地认识到新党章的涵义以及对我们共产党员的职责要求,更加透彻领会到中国共产党是工人阶级的政党,是中国工人阶级先锋队组成,它由中国工人阶级的先进分子组成。

《CPrimer》第15章学习笔记

《CPrimer》第15章学习笔记第15章:面向对象编程——面向对象编程基于三个基本概念:数据抽象,继承,动态绑定。

——用类进行数据抽象——用类派生从一个类继承另一个类:派生类继承基类成员;——动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数。

——能够容易地定义与其他类相似但又不相同的新类,能够更容易地编写忽略这些相似类型之间区别的程序。

——面向对象编程的关键思想是多态性(polymorphim)——继承而相关联的类型为多态类型。

——派生类(derivedcla)能够继承基类(baecla)定义的成员——派生类可以无须改变而使用那些与派生类型具体特性不相关的操作——派生类可以重定义那些与派生类型相关的成员函数,将函数特化,考虑派生类型的特性。

——在C++中,基类必须指出希望派生类重定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。

——我们能够编写程序使用继承层次中任意类型的对象,无须关心对象的具体类型。

——可以认为protected访问标号是private和public的混合:——1.像private成员一样,protected成员不能被类的用户访问。

——2.像public成员一样,protected成员可被该类的派生类访问。

——派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类类型对象的protected成员没有特殊访问权限。

——简单地说:提供给派生类型接口是protected成员和public成员的集合。

——为了定义派生类,使用类派生列表(claderivationlit)指定基类。

——claclaname:acce-labelbae-cla——这里的acce-label是public、protected或private,bae-cla是已定义的类的名字。

——一旦函数在基类中声明为虚函数,它就一直为虚函数,派生类无法改变该函数为虚函数这一事实。

C语言程序设计学习计划怎么

C语言程序设计学习计划怎么本学习计划的目标是帮助学生掌握C语言程序设计的基础知识,包括数据类型、运算符、流程控制、函数、数组、指针、结构体等内容。

学习结束后,学生应具备独立使用C语言进行编程的能力,能够解决基本的编程问题,具备继续深入学习其他编程语言的基础。

二、学习内容1.数据类型:整型、浮点型、字符型、枚举型等2.运算符:算术运算符、关系运算符、逻辑运算符、赋值运算符等3.流程控制:顺序结构、选择结构、循环结构等4.函数:函数的定义、声明、调用,函数参数传递等5.数组:一维数组、二维数组、多维数组的定义、初始化、访问等6.指针:指针的定义、指针和数组的关系、指针和函数的关系等7.结构体:结构体的定义、结构体数组、结构体指针等三、学习方法1.自学:利用教材、网络资源等进行自学,理解每个知识点的概念和用法2.实践:通过编写代码实际应用所学的知识,提高编程能力3.总结:对每个知识点进行总结,形成笔记或整理成文档,便于复习和查阅4.交流:与同学或老师进行交流,相互讨论,解决遇到的问题四、学习计划1.第一周:数据类型和运算符-学习数据类型的概念和分类,掌握各种数据类型的定义和使用方法-学习运算符的分类和优先级,掌握运算符的使用方法和规则-完成相关的练习和实例,加深对数据类型和运算符的理解和应用2.第二周:流程控制和函数-学习流程控制的三种结构(顺序结构、选择结构、循环结构),掌握各种结构的语法和应用-学习函数的定义和调用、参数传递等基本概念,了解函数的返回值和调用栈等概念-完成相关的练习和实例,加深对流程控制和函数的理解和应用3.第三周:数组和指针-学习数组的概念和定义,了解一维数组、二维数组、多维数组等,掌握数组的初始化和访问方法-学习指针的概念和定义,了解指针和数组的关系,指针和函数的关系等-完成相关的练习和实例,加深对数组和指针的理解和应用4.第四周:结构体和综合实践-学习结构体的概念和定义,了解结构体数组、结构体指针等-进行综合实践,包括编写小型程序和案例分析,综合应用所学的知识点-总结所学的知识,形成学习笔记或文档,做好复习准备五、学习资料-教材:选用权威的C语言教材,如《C程序设计语言》、《C Primer Plus》等-网络资源:利用MOOC平台、网站教程等免费资源,辅助学习和查找资料-实例代码:搜索常见的C语言实例代码,通过运行和分析,加深对知识点的理解六、学习评价学生在学习结束后,可以通过期末考试、实验报告、项目作业等方式进行学习评价,考察学生对C语言程序设计的掌握情况和实际应用能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 结构体struct 和类class可以互换,本质结构体是一种特殊的类,struct默认是public 而class默认是private 2. Cons int a; 常量是要进行初始的。:a(1); 3. 引用必须在定义的时候初始化。 4. 全局变量或者全局对象,在进入main函数之前就已经分配好了内存空间 5. 当基类的构造函数是为缺省的值时,在派生子类实例化时基类构造可以不带参数。 6. ::Showwindow() 这样的前面加两个冒号,表示调用的是全局函数,即平台sdk的函数。 7. 用const结尾的成员函数只能调用其他const结尾的成员函数。因为其他函数并不能保证同样不修改类的成员变量

成员函数后加const,表示:类作者提示你,这个函数不会导致对象状态改变 可以理解为"表示这个函数不会修改任何成员变量" 但不可绝对化。其实,还是可以修改由mutable关键字修饰的成员变量的。 8. C++中, 构造函数和析构函数可以被显示调用. 显示调用默认构造函数的语法:

a.A::A();(不能写成a.A();) , 显示调用非默认构造函数的语法: a.A::A(7);(不能写成a.A(7);); 显示调用析构函数的语法: a.A::~A();(可以写成a.~A();) . 显示调用构造函数和析构函数就像调用一般的函数一样, 并不意味着创建或销毁对象; 如果构造函数中动态分配了空间, 则显示调用构造函数会造成内存泄露. 创建对象时的隐式构造函数调用已经为对象分配了动态内存. 当用创建好的对象显 示调用构造函数时, 对象指向的动态内存更新显示调用时所分配的, 对象生命周期结束时析构函数所释放掉的是后一次分配的动态内存, 也就是说创建对象时隐式构造函数调用所分配的那块内存泄漏了. 如果析构函数中释放动态分配的空间, 则会造成多次释放同一内存, 会出现严重错误.

9. 析构函数和内存释放,有一篇的总结,因为内容长,以后贴上来

先看个简易的 class A { public: A(int i = 3){a = i;}; ~A(){cout << "destructor" << endl;} int value(){return a;} private: int a; };

int main() { A a; A *p = new(&a) A(10); cout << a.value() << endl; delete p; return 0; }

在a对象的地址上未析构a的时候,创建了新的无名堆对象,这样a的数据被覆盖了, 但是编译器并未收到析构函数调用的消息,所以它认为那块内存存放的仍然是a对象的数据,所以a.value()仍可以取回值,取回当时内存中那个地址处的值,这是已经是10了。 然后delete p的时候,执行两步工作, 1。无名对象的析构函数调用,告诉编译器,那块内存中的值不能解释成无名对象的数据了,对于无名对象而言,已经无效了(但对于a对象而言,因为编译器并未收到a对象析构函数的调用,所以认为那块内存中的数据对于a而言仍是有效的,是a的数据的) 2。问题发生在这个时候,delete p的第二个动作,归还内存给系统,标识为空闲内存(没有任何对象引用到的,没有任何函数占用的内存),而事实上,这是对于p所指对象而言,对于a对象,它仍引用到这块内存,这样产生了异常,系统认为是快空闲内存了,但确有个对象引用到了这块内存,行为属未定义。 这就好像两个指针指向同一块的内存,一个把内存释放了,另一个指针成了悬垂指针,对悬垂指针解引用取出的值无意义,随机的,看当时内存中的数据 简单的说, 构造函数就是通知编译器,这块内存的数据解释成一个对象,哪块是哪个数据成员的数据,这些信息是构造函数给编译器的,都是隐式给的;显式的动作可以放在构造函数中(并未必需的)的,是初始化(不给初始化值可以的,随机值),获取资源 析构函数就是通知编译器,这块内存中的数据以后无需维护了,可以让其它使用了,里面的数据再不能解释成类对象的数据了,析构函数调用之后可以两种选择 1。一般情况,归还内存,栈的,堆的,都是 2。保留内存,只析构对象,这常见于placement new,delete往往同时执行了两个动作,所以这是候并不能直接delete,而是显式调用析构函数(详细论述待以后的总结)

10. 学习笔记之c++ http://blog.csdn.net/todototry/article/details/1477210

11. int *pia = new int[10];

我们并不能给动态分配的数组每个元素一个初始化值,语法并不支持 基于这个原因,对于对象数组 如果并没有默认构造函数,不能创建动态对象数组,因为new对象数组的时候,自动调用构造函数以建立对象,(new不只是分配内存而已,而且给编译器标识出这块内存存放的是什么类型的对象,int,class A,这也属于new的行为,所以它调用构造函数,以提供识别数据类型,解析二进制数据流的能力)如果并没有默认构造函数, 语法上不支持逐个初始化列表给动态数组,这样就没法构造对象了 容器vector和内置数组类型,是一个道理, 关键在于理解:new的动作不只是分配内存,而且进行类型标识的行为

12. 两者释放的资源是不一样的,delete释放p指向的内容,它也调用析构函数,也就是说,

后者包含前者

而析构函数不释放p指向的内容,而是p指向的对象的成员变量占用的资源(不一定是内存,还可能是其他资源,如文件句柄/窗口/socket等)

13. 类的静态成员与常成员

http://wenku.baidu.com/view/d64fe68ecc22bcd126ff0ca3.html 14. Const http://baike.baidu.com/view/1065598.htm 15. 1 const 与volatile 的用法

1 const #include #include //行参数指向const 类型变量的指针 void display_c(cons int * pi) { cout<<"display_c:"<<*pi< } //行参为普通类型变量的指针 void display(int *pi) { cout<<"display_c:"<<*pi< } //const 类型变量 const int i1=1; //error i1=3; //const 类型变量的指针 int i2=2; const int * pi2=&i2; //error *pi2=3 // const 指针 int * const pi3=&i3; *pi3=5; // error *pi3=&i4 可以赋予不同的值,但是不可一指向不同的变量 //指向const 内容的const 指针 const int * cosnt pi5=&i5; 2 sizeof 返回某个便赖宁嘎或数据类型的长度 3 引用 1 引用变量 int i=1; int & r_i=i; 5 名空间 1 namespace namespace car { int model; int length; int width; } namespace plane { int model; namespace size { int lenth; int width; } } namespace car //添加名空间的成员 { char * name; } namespqce c=car; //定义别名 int Time //外不变量属于全局名空间

car::length=3; plane::size::length=70;

int Time=1996; ::Time=1997; 16. 2 using void main() { using namespace car; length; using namespace phane; model; 17. } 6 new 与delete 运算符 double * pd; // define pointer variable pd=new double; // allocate memory if(pd!=null) { ... delete pd; // free memory } 18. double1=null * pds=new double[100]; if(pds) { .... delete[] pds; 19. } 20. 如果是使用new 进行内存空间分配没有成功,则返回空指针null 释放一个数组分配的内存是,常常采用带[]的形式 7 void 指针 它指向一个地址值,但是不说名数据类型,可以使用void 指针创建一个通

用的函数,在使用 的时候将指针类型转化成相应的具体类型。 void ShowHex(void *pv,int siae) { .... ((unsigned char *)pv)[i]

相关文档
最新文档