2017.02.28 C/C++小知识点

来源:互联网 发布:2017淘宝卖什么利润大 编辑:程序博客网 时间:2024/04/29 23:20

1.赋值语句的返回值是所赋的值。所以在C/C++中才会有如下的连续赋值语句 a=b=10  即b=10这个赋值语句的返回值是10.

2.在32位机器上,int类型占4个字节,枚举类型同int类型,占4个字节。typedef只是一个声明,不占空间。空函数不占空间。

3.在结构struct中,各成员有个字的内存空间,一个结构变量的总长度是各成员长度之和。而在联合体union中,各成员共享一段内存空间,一个联合变量的长度等于各成员中的最长的长度。但是这个最长的空间要满足以下条件:1.要大于等于最长的一个变量的空间。2.要能够整除其他成员的数据长度,即联合体空间对其他成员的元类型要能够整除。联合体的各个成员都是从低字节开始公用的。

4. class A:public B{} A表示派生类,B表示基类。向上级类型转换是隐式的,即派生类可以转换为基类,因为部分元素丢弃可以自动完成,而基类不能转换为派生类,因为不知道该增加的值是什么。

5.class B{operator A();} operator除了表示函数重载以外,还可以表示B类型可以转换为A类型。class A{A(const B&);}通过拷贝复制构造函数进行隐式转换。

6.含有虚函数的类都会建立一张虚函数表,表中存放的是虚函数的函数指针,这个虚函数表的地址存放在类中,所以不管类中有几个虚函数,都只有一个虚函数表地址,对于32位系统,指针类型所占字节为4,而64位系统,指针类型所占字节为:8.

7.一个类所占空间:类的静态成员不做考虑,因为无论创造了多少对象,程序都只创建一个静态类变量的副本,也就是说类的所有对象共享同一个静态成员。不能在类的声明中初始化静态成员变量,因为类声明只是描述了如何分配内存,但并不实际分配内存。对于静态成员,需要在类声明之外使用单独的语句来进行初始化,因为静态类成员是单独存储的,不是对象的组成部分。 普通成员函数与类所占空间无关。类的大小也遵循class字节对齐的调整规则。

8.malloc返回一个void* 类型的指针,需要强制转化成其他类型的指针,如int*,这样才能表明指针的地址和指向内存单元的大小。int* p; p=(int* )malloc(sizeof(int))

9.对于浮点数的比较一般不能用==或者!=,要根据情况取一个精度值。

10.各个存储区的内存分配: 静态存储区域:内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量等

栈:执行函数时,函数内局部变量都存储在栈上。函数结束时,这些存储单元自动被释放。堆:动态内存分配所分配的空间在堆上,程序在运行的时候用malloc或者new申请任一大小的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存周期由程序员决定,使用非常灵活。程序中定义的常量存放在只读存储区。

11. 静态局部变量的特点:(1) 该变量在全局数据区分配内存;(2) 静态局部变量在程序执行到该对象的声明处时被首次初始化,以后的函数调用不再进行初始化。(3) 静态局部变量一般在声明处进行初始化,如果没有显示的进行初始化,会被程序自动初始化为0.(4)它始终驻留在全局数据区,直到程序运行结束,但其作用域为局部作用域。当定义它的函数或者语句块结束时,其作用域随之结束。

12. 通常我们开发的程序有2中模式:Debug模式和Release模式。(1) 在Debug模式下,编译器会记录很多调试信心,也可以加入很多测试代码,比如断言assert,方便出现bug时分析解决。(2) Release模式下,就没有上述那些调试信息,而且编译器会自动优化一些代码,这样生成的程序性能是最优的,但是如果出现问题就不方便分析测试了。

13. 指针指向常量,如 char *str=“aaaaa”和NULL时,不能通过指针修改常量,因为常量本身就是只读的,存放在只读存储区。

14. #pragma()指定对齐字节数,可选1,2,4,8,16

15. #include命令的功能就是在命令处插入一个文本文件,预处理器发现#include后,就会寻找指令后面<>中的文件名,并把这个文件的内容包含到当前的文件中,被包含的文件中的文本将替换源代码文件中的#include指令。

16. 指针和const  int const *p(或者 const int * p) 表示 不可以通过指针p改变其指向的内容,即 p指向的是一个const int,不可改变。int * const p 代表 指针本身的值不可以改变,即指针里面的地址不可改变,但是其所指向的值可以改变。

17. 全局对象的构造函数在main函数之前调用,析构函数在main函数之后调用;

       局部栈对象在定义的时候调用构造函数,除了作用域范围的时候调用析构函数;

       堆对象在new的时候调用构造函数,delete的时候调用析构函数;

       全局静态对象和全局对象一样;局部静态对象在定义的时候调用构造函数,main函数之后调用析构函数(因为其处于全局变量区)

18. 柔性数组(也叫伸缩性数组)反映了C语言对精炼代码的极致追求。这种代码结构产生于对动态结构体的需求,比如我们需要在结构体中存放一个动态长度的字符串时,就可以用柔性数组。char data[]或者char data[0],只能放在结构体的末尾处,可以使得这个结构体是可变长的。对编译器而言,数组名仅仅是一个符号,不会占用任何空间,它只是一个占位符。参考:http://www.cnblogs.com/nchxmoon/p/3145480.html

19. 指向空值的引用是没有意义的,因为引用对象不能改变,也就是这个引用永远指向null,那这个引用根本就没有存在的必要。指向控制的指针是有意义的,尤其在指针被删除后,如果不对指针进行赋值,则指针的值将会由系统随机指定。这样如果后续有对指针的操作将会带来很大的风险。因此指针被删除后必须赋值为null。

20. 只要const和int是相邻的,便可随意交换,其意义是一样的。const int a 和int const a 两者均表示a是一个int常量。

21.对数组名应用地址运算符时,得到的是整个数组的地址。

0 0
原创粉丝点击