码迷,mamicode.com
首页 > 编程语言 > 详细

c++基础----对c的增强

时间:2018-10-10 12:11:25      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:har   符号表   out   说明   eof   左值   开始   匿名   temp   

我们都知道c++是完全兼容c的,而且对c做了一定的优化。

c++与c的不同在于:

1.实用性的增强:变量可以任意定义了

在c中:变量的定义必须在函数使用之前,不然在有些早期的编译器中可能出错。

int i = 0;
for (i = 0; i < 10; i++)
{
}
//int b;//error

在c++中:变量可以任意定义,不过要注意变量的作用域和生存周期。

for (int i = 0; i < 10; i++)
{
    //***这里的i随for循环的结束而被释放
    int temp=1;
}
int b=2;

2..对全局变量检测能力的增强:不允许有重定义的现象出现

在c++中:一个变量不管是声明还是定义只能出现一次
//int g_val;
//int g_val=10;
//这样定义在C语言不会报错,但在c++中会出错

3.对struct增强

在c中

struct teacher
{
    int id;
    char name[64];
};
void test2() 
{
    //在c语言中只能struct teacher t;这样定义除非加上typedef
    //而在c++可以这样:
    //teacher t;
}

4.对函数检测增强

c++中对形参传递,返回值做了严格的检查,不允许任意传,任意调用,必须有返回值。

而在c则可以任意,不过一般按照规范去写。

void f(int i) 
{
    cout << i << endl;
}
void test3() 
{
    f(1);
    //在c中这样不会报错(warning),而在c++中这样会报错(error)。
    //f(1, 2, 3);
}

5.新增bool类型

在C语言中:非0代表真,0代表假

int flag =1;//
int flag=-1;//
int flag=0;//

在c++中新增了一个bool变量,bool变量的值只有0或1.

bool flag = true;
flag = false;//true--真,false--假
cout << "bool的size="<<sizeof(flag) << endl;//1个字节
cout << "flag=" << flag << endl;//为true值为1,为false值为0,不管为bool类型赋非0值则为1(true),bool值只有0/1

6.对三目运算符的增强

在c中:a > b ? a : b = 30一般会编译出错。原因是a > b ? a : b返回的是10,10=30会出错

而在c++:a > b ? a : b返回的是对b的引用。

不过要注意:a > b ? a : b作为左值时返回的结果不能有常量(常量不能取地址)。做右值时任意

//c中:
void test5()
{
    int a = 10;
    int b = 20;
    int max = a > b ? a : b;
    printf("%d\n",max);
    //c++:
    a > b ? a : b = 30;//在c中这个会出错20=30没有意义,在c++中可以使用a > b ? a : b 返回b变量的引用*(a>b?&a:&b)=30
    cout << "b=" << b << endl;//30
    //a > b ? 10 : b = 30;//error,作为左值时返回的结果不能有常量(常量不能取地址)。做右值时任意
}

 7.const增强

在c中:

1)const并不是一个常量,是一个变量加了只读属性.

2)const int 和int const是一样的。

3)const修饰的变量实际上是可以通过指针改变的。是一个假的常量

int const a = 1;
const int b=1;
int *p = (int*)&a; 
*p = 20;

4)与#define是有区别的。#define在预编译时处理,const在编译时处理。

在c++中:

1)const修饰表示的就是常量。

const int a=1;这在c++中并不会在栈空间中开辟空间,而在内存中会有一个符号表去记录key---value.

2)a实际上是一个符号,是不能去访问地址的,但c++发现对一个const常量符号取地址时,会临时在栈上开辟一个临时空间,这个变量是匿名的。p-->临时变量

*p改变的是临时变量,而不是常量a.

技术分享图片

3)const做参数使用:

const teacher *t:const teacher指针可动,指针指向的常量不可变
teacher * const t:teacher * const指针不可动,指针指向的常量可变
const teacher * const t:指针不可动,指针指向的常量不可变
说明图:

技术分享图片

void change_teacher1(teacher *t)
{
    t->id = 10;
}
void change_teacher2(const teacher *t)
{
    //t->id = 10;//此时t指向的一个区域为常量不能被修改
    teacher t2;
    t = &t2;
}
void change_teacher3(teacher *const t)
{
    t->id = 10;
    //teacher t2;
    //t = &t2;//t是一个常量指针,不能修改
}
void change_teacher4(const teacher *const t)
{
    //t->id = 10;//此时t指向的一个区域为常量不能被修改
    //teacher t2;
    //t = &t2;//t是一个常量指针,不能修改
}

8.enum的增强

在c++中不用在使用enum的值直接给enum变量赋值了。

enum num
{
    a=0,//从0开始累加,不写默认为0开始.
    b,
    c,
    d
};
void test8()
{
    enum num n = a;
    /*n = 0;
    n = 1;
    n = 2;
    n = 3;*/
    //在c语言中给枚举类型赋值时,可以通过枚举值赋值,而在c++中不可以
}

 

c++基础----对c的增强

标签:har   符号表   out   说明   eof   左值   开始   匿名   temp   

原文地址:https://www.cnblogs.com/knight11/p/9763884.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!