这段时间又开始要用到之前学的C++,选一项简单说说一些总结,当然具体的详细的一些东西,等以后有时间,再慢慢补充吧

作为面向对象的编译型语言,C++与C的主要区别,就是有类这个概念,与C中的结构体不同,C++的类里面是可以装函数的(C语言的结构体里面之只能装数据,最多装个函数指针)

之前,做的一些总结,已经知道C语言结构体在内存中的一些特点(物理相邻),但是类中也是这样的吗?C++的类里面存放函数?
查了一些资料后,发现,C++类中的函数并不是并不会和类中的数据存放在一起,而是和其它的函数(普通的函数)存放在一起,如果C++类中,除了数据还定义有函数。在创建具体的对象后,函数体并不会和数据呆在一起,和数据呆在一起的只有一个指针,这个指针,指向一个指针数组,数组中都是该类定义函数的函数指针。
另外,如果有为方便,定义了虚函数,那么,该对象的内存中还会有一个指针,叫虚函数表指针(好像叫vtable_ptr),具体作用和前面的函数指针数组一样,不过,有一点不同的是,如果有被继承的动作,虚函数表被继承后是可改的,

每一个类都有各自的函数表,和虚函数表。有且只有一个(多了浪费内存空间)。每一个依据类而具现的对象,都只会有对应表的指针。

一定要,区分类的声明,和类的实现(一个是在,编译阶段起作用,一个是在实实在在出现在内存中)


还有就是命名空间(namespace)了,
命名空间最直接最原始的作用就是为了防止函数和数据的重名,C++做了很多的这样的努力(还有函数的重载),就是为了避免C语言中千奇百怪的函数名出现。
其实,就最终的结果而言,并没有什么不同,在C++中,每一个函数最后(以他的参数,作用为特征区分)都会有它独一无二的名字,其实就相当于,起名字这个过程,我们(写代码的人)做了一半,而另一半则是由编译器帮我们完成,编译器会在编译阶段,为我们的函数名后面,加一点东西,作为特征。其中有一部分就是命名空间的。也就是说,在我们的函数名里面也是有一两个数据单位,指明了它是属于那个命名空间的

C++中有一个操作是,初始化列表,和构造函数作用差不多,效率也差不多,语法糖的作用多一点

具体的一部分,等之后再补吧

C中随机数的使用

1
2
3
4
fd = open("/dev/urandom", 0);
read(fd, &buf, 8uLL);
close(fd);
srand(buf);

哦,说一下原码,补码,反码

正数的三个码不变

负数的反码,补码符号位不变。


一定记得,逻辑操作和按位操作是不一样的。

C中的位域操作

1
2
3
4
5
6
struct bs{
unsigned a:4;
unsigned :4; /* 空域 */
unsigned b:4; /* 从下一单元开始存放 */
unsigned c:4
}

C中使用宏来创建伪函数

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

#define message_for(a, b) \
printf(#a " and " #b ": We love you!\n")
//‘#’用来表示变量
int main(void)
{
message_for(Carole, Debra);
return 0;
}

有个双#号操作,遇上再说吧,感觉可能用得挺少

C中错误处理

c中允许以访问返回值的形式检查错误,设置errno来接受

perror()[print error]和strrerror()[string error]来打印错误

  • perror() 函数显示您传给它的字符串,后跟一个冒号、一个空格和当前 errno 值的文本表示形式。
  • strerror() 函数,返回一个指针,指针指向当前 errno 值的文本表示形式。

C中可变参数

1
2
3
4
5
6
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位数)高的过度

⬆︎TOP