[C++_1]C与C++区别

操作环境: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;


赋值:strcpy(); s1=s2;
链接: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.h

C++专门增加了一个bool类型


1.5 引用reference

引用背后是用指针来实现的。本质是指针; 引用必须用同类型的变量初始化,如果用常量初始化,就必须加const 。
引用和被引用是同一个变量,所以是同一个地址,同一块内存,所以引用做参数可以避免复制,推荐使用引用作为形参,常量使用const修饰,不仅仅指替代指针形参。

为什么要使用引用:使用引用可以减少由复制带来的时间和空间支出。


1.6 强制类型转换

C++中尽量少用强制类型转换,用以下几种代替

static_cast         //数值类型之间转换,有一方是void*之间转换
const_cast         //把常量转成变量,用于临时去掉const、volatitle限制
reinterpret_cast //任意两种指针类型之间和数值类型之间转换

dynamic_cast    //父子类转换


int n=static_cast<int>(45.67);
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++编译



注:这就是C++ 中的常量折叠:指const变量(即常量)值放在编译器的符号表中,计算时编译器直接从表中取值,省去了访问内存的时间,从而达到了优化。而在此基础上加上volatile修改符,即告诉编译器该变量属于易变的,不要对此句进行优化,每次计算时要去内存中取数。
这里也有个小细节:每种编译器对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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值