C++的一些简单记录
这段时间又开始要用到之前学的C++,选一项简单说说一些总结,当然具体的详细的一些东西,等以后有时间,再慢慢补充吧
作为面向对象的编译型语言,C++与C的主要区别,就是有类这个概念,与C中的结构体不同,C++的类里面是可以装函数的(C语言的结构体里面之只能装数据,最多装个函数指针)
之前,做的一些总结,已经知道C语言结构体在内存中的一些特点(物理相邻),但是类中也是这样的吗?C++的类里面存放函数?
查了一些资料后,发现,C++类中的函数并不是并不会和类中的数据存放在一起,而是和其它的函数(普通的函数)存放在一起,如果C++类中,除了数据还定义有函数。在创建具体的对象后,函数体并不会和数据呆在一起,和数据呆在一起的只有一个指针,这个指针,指向一个指针数组,数组中都是该类定义函数的函数指针。
另外,如果有为方便,定义了虚函数,那么,该对象的内存中还会有一个指针,叫虚函数表指针(好像叫vtable_ptr),具体作用和前面的函数指针数组一样,不过,有一点不同的是,如果有被继承的动作,虚函数表被继承后是可改的,
每一个类都有各自的函数表,和虚函数表。有且只有一个(多了浪费内存空间)。每一个依据类而具现的对象,都只会有对应表的指针。
一定要,区分类的声明,和类的实现(一个是在,编译阶段起作用,一个是在实实在在出现在内存中)
还有就是命名空间(namespace)了,
命名空间最直接最原始的作用就是为了防止函数和数据的重名,C++做了很多的这样的努力(还有函数的重载),就是为了避免C语言中千奇百怪的函数名出现。
其实,就最终的结果而言,并没有什么不同,在C++中,每一个函数最后(以他的参数,作用为特征区分)都会有它独一无二的名字,其实就相当于,起名字这个过程,我们(写代码的人)做了一半,而另一半则是由编译器帮我们完成,编译器会在编译阶段,为我们的函数名后面,加一点东西,作为特征。其中有一部分就是命名空间的。也就是说,在我们的函数名里面也是有一两个数据单位,指明了它是属于那个命名空间的
C++中有一个操作是,初始化列表,和构造函数作用差不多,效率也差不多,语法糖的作用多一点
具体的一部分,等之后再补吧
C中随机数的使用
1 | fd = open("/dev/urandom", 0); |
哦,说一下原码,补码,反码
正数的三个码不变
负数的反码,补码符号位不变。
一定记得,逻辑操作和按位操作是不一样的。
C中的位域操作
1 | struct bs{ |
C中使用宏来创建伪函数
1 | #include <stdio.h> |
有个双#号操作,遇上再说吧,感觉可能用得挺少
C中错误处理
c中允许以访问返回值的形式检查错误,设置errno来接受
perror()[print error]和strrerror()[string error]来打印错误
- perror() 函数显示您传给它的字符串,后跟一个冒号、一个空格和当前 errno 值的文本表示形式。
- strerror() 函数,返回一个指针,指针指向当前 errno 值的文本表示形式。
C中可变参数
1 | int func(int, ... ) //int使要传递的可变参数的总数 |
不定参数列表的类型使va_list
va_start(va_list,int),初始化参数列表
va_arg(va_list,int),获取最近的该类型数据,之前被获取过的会被弹出
va_end(va_list),关闭不定参数列表
C命令行参数,getopt()和getopt_long()
信号
sig_atomic_t
遇到unsigned int和int的混合运算,一般是向精度(使用的bit位数)高的过度