C和C++之间有一点区别
来源:互联网 发布:windows 回到桌面 编辑:程序博客网 时间:2024/06/08 15:28
一、注释
二、布尔类型与逻辑运算
而在一些人用的键盘上,没有如&,|,^等键,于是,C++增加了一些关键字,见表1:
关键字
含义
and
&&(逻辑与)
or
||(逻辑或)
not
!(逻辑非)
not_eq
!=(逻辑不等于)
bitand
&(按位与)
and_eq
&=(按位与赋值)
bitor
|(按位或)
or_eq
|=(按位或赋值)
xor
^(按位异或)
xor_eq
^=(按位异或赋值)
compl
~(按位非)
表1跟三元转义符相似,C++里面还有一种token替代语法,跟三元转义符相比,它们不是纯文本替换,它们自己是token的一种,可以算作对应token的别名,数量则稍微多了点:
替代的 原有的 替代的 原有的 替代的 原有的
<% { and && and_eq &=
%> } bitor | or_eq |=
<: [ or || xor_eq ^=
:> ] xor ^ not !
%: # compl ~ not_eq !=
## bitand &
这个规则不会替换字符串和注释中的符号。
三、引用(Reference)的出现与函数调用
四、C++定义块的消除
五、强制转换
x = int(y);
或许,强制转换可以体现C的灵活性,但是,它也是一种很不安全的做法。C++增加了与强制转换有关的四个关键字,如表2:
static_cast
“行为良好的”和“行为合理的”强制转换,包括可能不需要的强制转换(比如自动类型转换的)
const_cast
转换掉const和/或volatile
reinterpret_cast
转换成完全不同的含义,关键是你需要转换回去并且安全地使用。转换成的类型一般是你想要耍点小把戏或者其他神秘的目的。这是最危险的强制转换
dynamic_cast
安全类型向下转换(与类有关)
表2
六、struct含义的变化
struct
{
};
C++对C的不向下兼容
C++:尽可能地与C靠近,但又不过分地近——《C++语言的设计和演化》
一、C++字符常量的出现
printf(“%d\n”, sizeof(‘x’));
用C编译,输出的结果是sizeof(int)的值,而用C++编译,输出的是1。
二、C++对enum严格的类型检查
enum {a, b, c, d, e, f, g, h, i} x;
x = a;
把enum类型与int区分开来,这在实现函数重载上也会有很大的好处(下文会讲到重载)。
三、C++对指针运算的一些限制
int *p;
void *a;
p = a;
a + 1;
在C++中是不合法的,而在C中是合法的,与
(void *)((int)a + 1);
等价。
C++种禁止的另外一项是指针的减法,而在C中,指针的减法是被允许的。例如:
int a, b;
在C中,&b - &a的值为((int)&b – (int)&a) / sizeof(int),在C++中,这是不允许的。
四、函数使用的一些不兼容
`x' was not declared in this scope
ISO C++ forbids declaration of `f1' with no type
syntax error before `int'
C功能的C++新方法
一、#define与const
但是const的出现,使得#define定义常量变得不受欢迎。因为#define只是做简单的文本替换,从定义的那刻起,一直到程序的末尾或者有指令#undef停止#define继续文本替换。但是const具有清晰的作用域的概念,因此使用const定义常量被认为是更好的方法。
例如:
#define b 10
int f()
{
}
会出现这样的编译错误:
parse error before numeric constant
对于初学者来说,可能对这个编译错误莫名奇妙。因此,尤其是在C++编程中,用const被认为一种好的编程习惯。不过,对于关键字const的处理方法,C与C++也是不同的,C中const的作用域默认是全局的,而C++中const的作用域默认是内部的。如果要在C++中使const的作用域是全局,那么可以用extern来声明。另外,在C中,const是有存储空间的,但是C++中,一个const有没有存储空间取决于这个const怎么用,如果没有必要,就不会给这个const开辟空间,比如仅仅需要用某个值来代替这个变量名(和C的#define很像)。
const int a = 10;
int *p = &a;
(*p)++;
在C中,这样就把a的值改变了,虽然这样做是危险的。但是用C++编译这个程序的时候,会出现这样的编译错误:
invalid conversion from `const int*' to `int*'
二、#define与inline
y = 2 + 1 * 2 + 1;
并不是想要的
y = (2 + 1) * (2 + 1);
另外一个更加限制#define定义函数的使用的是,这样的文本替换,如果“参数”本身是一个表达式,那么,这个表达式所产生的作用很可能是无法预料的,比如,对上例
#define f(x) (x) * (x)
如果程序员这样调用:
y = f(++x);
就变成了:
y = (++x) * (++x);
一般程序员都只想让x加1,但是调用完f(x)之后,x的值增加了2。
在C中,这两个问题是很严重的,因为这样的错误很难查出来。在C++中,inline函数的出现很好得解决了这些问题。
inline在C++中出现的必要性并不是因为以上所说的原因,而是因为类的使用的需要。然而,由于涉及面向对象,本文并不讨论inline在类上的应用。本文讨论的是,inline函数的出现将很好得解决。
inline函数和普通的函数差不多。区别是,普通的函数通过调用来实现函数的功能,而inline函数直接把函数的代码编译,嵌入使用的地方。inline函数的定义与#define一样简单,只要在定义在使用之前。例如:
inline int f(int x)
{
}
值得注意的是,inline函数的声明对inline与否并没有作用。另外,代码是否被嵌入使用的地方(即inline与否),也并不是完全取决于inline关键字,由于某些函数是不可能做到inline的(比如,递归调用的函数),因此,inline关键字只是告诉编译器,如果可能的话,inline吧。
inline函数的优点在于,执行速度比普通的函数快,没有#define“定义函数”带来的烦恼。它的缺点是会加大编译后的目标文件,所以inline函数也是不能不加节制地使用的。
二、函数重载,运算符重载和默认参数
三、C++的iostream与C的stdio
- C和C++之间有一点区别
- .c和.h之间关联和区别
- c 和c++ struct之间的区别
- C、C++和VC++之间的区别
- C、C++和VC++之间的区别
- 【C/C++】STL,ATL,WTL之间的联系和区别
- C,C++,VC++,MFC之间有什么区别和联系
- C,C++,VC++,MFC之间有什么区别和联系
- C,C++,VC++,MFC之间有什么区别和联系
- C,C++,VC++,MFC之间有什么区别和联系
- C,C++,VC++,MFC之间有什么区别和联系
- C/C++、JAVA、C#之间的关系和区别?
- NDK 之 c 和 c++之间的区别
- b/s 与c/s之间的区别和联系
- C和C++内存区之间的区别
- 新手须知 C、C++和VC++之间的区别
- redis:C字符串和SDS之间的区别
- c/c++/java之间的区别
- linux c/c++ 段错误bug的调试 详细介绍
- 一个女孩的工作经历告诉我们
- 我看了半天还是没看明白大巴为什么当上助攻王的原因,反而稀里糊涂看了那么多国产后卫的名字
- 总结CSS对IE与FF兼容性的经验
- eclipse/myeclipse注释模板
- C和C++之间有一点区别
- [IOS]iphone之在视图上显示当前的时间,并且时间还在走。
- xcode4中配置Three20开发环境
- 深入讨论设计模式中的State状态模式
- Python_字典排序问题
- ASp.net 剖析三层架构
- 测试中的等价类划分
- 思想
- 升级日记_20111205