1,C++与C
C++之所以保留面向过程,是为了兼容C,以保证大部分C代码,无需修改就可以在通过C++编译器的编译。但是两者也是有很多的区别的,这里简单列一些比较常见的区别:
(1)在C中,如果类型声明语句中没有指定类型名,该类型被假定成int,这种隐式转型在C99与C++中是不允许的;
(2)字符常数在C中被自动作为整形来处理,但在C++中则不是;
(3)int func()在C++中一般被编译为int func(void);
(4)在C++中,可以获得register型的地址,既寄存器地址,而在C中不可以获得这种地址;
2,C++基础定义
(1)指针
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。
如:int* ptr 指针的类型是int*,指针指向的类型是int,指针的值,既它所指向的内存区是int型的值,指针本身所占的内存大小在32位机下是32.这里需要注意的是:指针所指向的变量的生存期要不短于指针本身的生存期。
引用和指针有如下三种区别:
a 引用必须在声明时初始化,而指针不用;
b 对于NULL不能引用,而指针可以指向NULL;
c 引用一旦声明,引用的对象不能改变(但对象的值可以改变);而指针可以随时改变指向的对象。
由此可知:引用能做到的,指针也可以,但指针更危险;
(2)内联函数
a,内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。
b, 在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。
c,内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话将会获得比较好的效率.
d, 内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。
(3)类型转换
reinterpret_cast 将一个类型指针转换为另一个类型指针
const_cast 用于去除指针变量的常属性,将它转换为一个对应指针类型的普通变量,反过来也可以将一个非常量指针转换为一个常量指针变量
static_cast 用于转换基本类型和具有继承关系的类新之间转换,不太用于指针类型的之间的转换
dynamic_cast 只能在继承类对象的指针之间或引用之间进行类型转换
(4)宏
C++ 宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。++提供的编译预处理功能主要有以下三种: 宏定义, 文件包含,条件编译。
eg: 宏定义: #define AREA (PI*R*R);
文件包含: #include
条件编译:#ifndef MAIN_H_
#define MAIN_H_
其它内容
#endif
(5)内存分配
一般认为在c++中分为这几个存储区
1栈 - 有编译器自动分配释放
2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
4另外还有一个专门放常量的地方。 - 程序结束释放
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效
3,面向对象
4,泛型与STL
5,C++的库