C++继承了所有C的特性
C++设计目标是运行效率与开发效率的统一
C++(面向对象、类型加强、函数加强、异常处理)
————/
C++强调语言的“实用性”,所有变量都可以在需要时再定义
intc=0;
for(inti=0;i<10;i++){ //c中错误
for(intj=0;j<10;j++){
c+=i*j;
}
}
————/
C中register关键字请求编译器将局部变量存于寄存器,无法取得register变量地址
C++编译器有自己的优化方式,不使用register也可能优化,仅为兼容c语法
C++中可取register变量地址,取register变量地址时,register对变量的声明变得无效
早期C编译器不会对代码进行优化,因此register变量是一个很好的补充
————/
constint c=0;
int*p=(int*)&c;
*p=5;
printf("c=%d\n",c);
//c编译结果5
//c++编译结果0,process exited normally
C++编译器:
当碰见常量声明时在符号表中放入常量
编译过程中若发现使用该常量则直接以符号表中的值替换
编译过程中若发现对const使用了extern或&操作符,则给对应常量分配存储空间
C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值
C语言中const变量是只读变量,不能出现在赋值号左边,但有自己的存储空间
C++中const常量可能会被分配存储空间(目的兼容c):
当const常量为全局,且需要在其它文件中使用(extern)
当使用&操作符取const常量地址
————/
int main(int argc, char *argv[]) {
const int a = 1;
const int b = 2;
int array[a +b] = {0};
//c运行错误,因ab本质变量,编译时无法确定,c++编译运行正常
int i = 0;
for(i=0; i<(a+b); i++)
{
printf("array[%d] = %d\n", i, array[i]);
}
return 0;
}
————/
C++中const常量类似于宏定义 const int c = 5 ≈ #define c 5
C++中const常量与宏定义不同:
const常量由编译器处理,提供类型检查和作用域检查
宏定义由预处理器处理,单纯文本替换
————/
void f()
{
#define a 3
const int b = 4;
}
void g()
{
printf("a = %d\n", a); //正确,宏未达到预想局部效果
printf("b = %d\n", b); //报错
}
int main(int argc, char *argv[])
{
f();
g();
return 0;
}
解决方法:f()末尾加 #undef a
————/struct类型的加强
C语言struct定义一组变量的集合,C编译器并不认为这是一种新类型
C++中struct是一个新类型定义声明
struct Student{
intage;
constchar*name;
};
int main(){
Students1={26,"lyl"}; //c++正确,c不认为Student是一新类型
}
————/
C++中所有变量和函数都必须有类型
C中默认类型在C++中不合法
f(i){ //c编译正确,默认参数、返回值均为int类型
printf("i=%d\n",i);
}
g(){
return5;
}
int main(){
f(10);
printf("%d\n",g());
g(1,2,3); //不报错,垃圾特性
return0;
}
int f(); 与 int f(void); 的区别是什么?
C++中f()即认为其不接受任何参数
————/
C中,int f()表返回值为int,接受任意参数
C++中,int f()和int f(void)都表示返回值为int无参函数
————/总结
C++以C语言为基础进行了加强
C++更强调实用性,可在任意地方声明变量
C++中register只起向后兼容作用,C++编译器能够进行更好的变量优化
C++中const是个真正意义上的常量,而不是只读变量
C++强类型,任意程序元素都必须明确指明类型