计算机杂七杂八的知识

1.详解字符串匹配的KMP算法

本文转载自https://www.cnblogs.com/c-cloud/p/3224788.html

2.枚举类型enum

转载自:http://c.biancheng.net/view/1367.html
枚举类型的意义:当需要定义多个整型常量的时候用枚举会比const int 方便管理且简洁。

3.C++和C的区别

C++:面向对象,以功能划分程序,因为其封装继承多态的特点,各部分耦合度低,便于维护扩展。
C: 面向过程,以步骤来划分程序,各部分耦合度高,性能好,但是不利于维护和功能的扩展。

4.C++中的类型转换

1.隐式转换:算术转换,指针的转换,转换成布尔类型,转换成常量,类类型的转换。
2.显示转换:static_cast(除了包含底层const都可以用),const_cast(去掉底层const,或者加上底层const),dynamic_cast(类类型的指针或引用的转换,可以从基类到派生类,也可以从派生类到基类),reinterpret_cast(几乎什么都可以转,但很容易出问题)
关于const_cast一个很妙的用法:
例如一个用来查找的函数find(),这个函数的本意是用来找东西,并不想改变里面的值。但是当调用这个find()函数的对象是一个非const对象时,在调用的过程中就有风险会改变内部数据。所以我们定义两个版本的find()函数,一个this指针带底层const,一个不带const,非const的版本的find()负责接受非const对象,然后在函数体内用const_cast把非const对象转换为const对象,再调用const版本的find()函数,调用完之后,再用const_cast把结果的const去掉。
tinyXML中很多函数都采用了这样的策略:

TiXmlNode* FirstChild( const char * _value ) {
		// Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe)
		// call the method, cast the return back to non-const.
		return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value ));
	}

5. 断言assert宏

,定义在头文件assert.h中,如下所示:
#include <assert.h>
void assert( int expression );
判断expression是否为false,如果为false,则系统停止,并打印出错信息。
为什么要用assert宏,而不是异常处理模块,因为assert 用来避免显而易见的错误,而异常处理模块是为了处理异常,错误是不应该出现的,异常是无法避免的。

6.stdio.h中的函数

1.int fseek(FILE stream, long offset, int fromwhere);函数设置文件指针stream的位置。
如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置,函数返回0。如果执行失败,则不改变stream指向的位置,函数返回一个非0值。
stream 指针通常指向二进制文件,当stream指针指向文本文件时,只有
fseek(fp, 0, SEEK_SET) 以及fseek( file, 0, SEEK_END )可以得到预期的结果。
2.long ftell(FILE
stream)返回当前文件指针距离文件开头的偏移字节数。
3.size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
从给定流 stream 读取数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回 0。

7.ASCII码

ASCII码共有256个,前128个被称为low-ASCII码,是在任何系统中都能正确显示的ASCII码,后128个是扩展ASCII码,有些系统可能不支持。
数字0-31表示控制字符,比如控制打印机,摄像头,换页等功能
32-127代表打印字符,即能在键盘找到的所有按键
128-255代表扩展打印字符,表示各种乱七八糟的符号
char类型的本质就是ASCII码,也就是用0-255的数来表示各种字符,所以char型可以和int型直接进行比较。需要注意的是ASCII码里的’0’-‘9’字符对应的数字不是0-9,而是48-57,所以要想确定一个字符c是不是’0’-‘9’之间的,不能直接比较c和数字0或9,应该比较c和’0’和’9’。

8.unicode统一码—是包含世界上所有语言的编码

它规定所有字符都用两个字节来表示。但由于英文字符只需要一个字节就能表示了,例如ASCII码,强行规定它用两个字节表示,十分浪费空间,尤其是在网络传输的时候。
所以出现了UTF-8码,是一种针对unicode的可变长转换编码,它可以用1-4个字节来表示unicode,例如使用一个字节来编码英文字符,3个字节来编码本应占2个字节的unicode汉语字符。最高位1的个数表示了字符占的字节数。
0xxxxxxx 一字节
110xxxxx 10xxxxxx 二字节
1110xxxx 10xxxxxx 10xxxxxx 三字节
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 四字节

9.TinyXML解析文件时为什么要把/r/n和/r 全部转化成/n?

因为不同系统的文件中表示换行的转义字符使不同的:
Unix系统用 ‘\n’;
Windows系统用 ‘\r\n’;
Mac系统是’\r’
但输出成C++程序时,换行用’/n’表示,所以全部转换成’/n’就统一了不同系统的输出格式。

10.new出来的对象如果不是智能指针管理,则使用结束后一定要delete

delete指针会销毁指针所指对象,释放对象所占内存,但是,不会回收指针,所以指针仍然指向那片地址,只是那里没有内存了,指针成为了野指针,十分危险。所以delete指针后,我们要手动把把指针置NULL或0;

11.合成析构函数不会delete一个指针数据成员。

类的析构函数执行时,类内数据成员按照初始化顺序的逆序进行销毁,类类型的成员会调用自己的析构函数,内置类型的没有析构函数,所以销毁内置类型时什么都不做,等待生存周期过了自动释放。这里面包含一个问题,内置的指针类型,如果时管理的时new出来的对象的话,析构函数执行时是不会delete这个指针的,所以需要手动把delete指针的代码包含到析构函数中。

12.如果一个类需要自己定义析构函数,则也需要自己定义拷贝构造函数和拷贝赋值运算符。

所以一般要么定义所有拷贝控制成员,要么不定义任何拷贝控制成员。但也有例外,比如有些类只定义拷贝构造函数和拷贝赋值运算符,但不需要析构函数。

13.fork()函数创建一个子进程

fork函数调用一次,创建一个子进程,返回两次,父进程返回子进程的ID,子进程返回0。
因为两个进程共享 代码段,数据段还有堆栈段,所以两个进程会同时执行fork之后的语句,根据PID的不同,执行的分支也会不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值