操作环境:Ubuntu 13.10 编辑环境:vim/kate 编译器:g++
1 C++与C的区别
1.1 编译器及头文件等
1可以选用个g++编译器2源文件扩展名可以是 .cpp .C .cxx .cc
3不再使用C中的头文件,将xxx.h替换为cxxx,取消.h后缀; C++头文件所在位置: /usr/include/C++/4.1.1/
4 C++风格输出使用cin/cout,标准类,函数,变量,对象都在std的命名空间中
1.2 字符串风格及函数
C风格字符串 char s2[100];C++风格字符串 string s1;
链接:strcat(); s1+s2; +=
比较: strcmp(); == != > >= < <=
长度: strlen(); s1.size()或s1.length()
查找:strchr();或strstr(); s1.find();
1.3 结构 联合 枚举变量的定义
C++中枚举 结构 联合在定义时用关键字,在使用时就不用了;增加了匿名联合可以把枚举提升成整数类型,但不能把整数类型隐式转换成枚举类型,可以强制类型转换 ,C语言中enum是整数
注: C++类型检查更加严格
1.4 bool类型
C语言中没有bool类型,若想使用bool类型,需添加stdbool.hC++专门增加了一个bool类型
1.5 引用reference
引用背后是用指针来实现的。本质是指针; 引用必须用同类型的变量初始化,如果用常量初始化,就必须加const 。引用和被引用是同一个变量,所以是同一个地址,同一块内存,所以引用做参数可以避免复制,推荐使用引用作为形参,常量使用const修饰,不仅仅指替代指针形参。
为什么要使用引用:使用引用可以减少由复制带来的时间和空间支出。
1.6 强制类型转换
C++中尽量少用强制类型转换,用以下几种代替static_cast //数值类型之间转换,有一方是void*之间转换
const_cast //把常量转成变量,用于临时去掉const、volatitle限制
reinterpret_cast //任意两种指针类型之间和数值类型之间转换
dynamic_cast //父子类转换
int* p=static_cast<int *>(calloc(sizeof(int),10));
const int k=n;
const_cast<int&>(k)=789; //转成原来常量变量的引用,k的值是789
1.7 const修饰变量
C语言可以通过指针改变const变量的值 (有警告),C++不可以(编译错误)
#include<stdio.h>
int main()
{
/*volatile */const int i = 10;
int *p = (int *)&i;
*p = 123;
printf("&i = %p\n p = %p\n",&i,p);
printf("i = %d\n *p = %d\n",i,*p);
return 0;
}
gcc编译 | g++编译 |
|
|
这里也有个小细节:每种编译器对volatile修饰符的修饰作用效果不一致,有的就直接“不理会”,如VC++6.0编译器。
1.8 const对成员函数的修饰
const void print(bool newline=true); //返回值是只读的
void print(bool newline=true)const; //常成员函数, Const成员函数不能改变对象的成员函数
成员函数中,末尾有无const也构成重载。 如果两个函数一样,一个是const另一个是自由的,编译器会优先考虑自由的;如果对象一开始被定义是const的,就会优先调用const的.
1.9 堆内存分配
C:malloc与free C++: new与delete配对使用
int *p=static_cast<int*>(malloc(sizeof(int)));
int *q=new int;
delete q; //释放q指向的地址,同时指针q也要设置成q=NULL