C++_03_C++的增强

一、C++相较于C,实用性增强

  C语言中的变量理论上都必须在作用域开始的位置定义!!即:必须先全部定义初始化完成后在使用;而不能先定义一部分,在执行后面语句的时候突然想起再定义。
(理论上是不可以的,但部分编译器也会编译通过)

  C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。随时需要的时候再随时定义即可。

  简单来讲就是C语言比较讲规矩,墨守成规,大家默认的规则就是先在指定的地方集中先定义初始化,后面在直接用;而C++比较机灵,C++的一切行径都是为了实用而不是为了美观或者规范,
因为大家编代码的时候,可能你并不知道你后面会用到那些变量,扎堆定义确实是比较麻烦的,当然也是美观度,但是不够实用。
  C++就是最求实用,比如在for循环中 for(int i=0;i<10;i++)  在C++中是完全没问题的

二、C++的类中为什么需要引入成员函数的概念?

   我们都知道C++中的类(class)和C语言中的结构体有异曲同工之妙,但是类中多了一种类型:“函数”。是的,被称为“成员函数”。

#include<iostream>
using namespace std;//c++的命名空间
class circle
{
public:
    double r;
    double pi = 3.1415926;
    double area = pi*r*r;
};

// 2010编译不通过 但是在2013编译器能编译通过
int main()
{
    circle c1;
    cout << "please input your r" << endl;
    cin >> c1.r;

    cout << c1.area << endl;    //乱码

    system("pause");
    return 0;
}

  看如上例子:这个代码实际上编译只有两种结果,要么直接编译不通过,要么编译通过,但结果与实际值不相符(结果随机)!
分析:1、首先类是不占用内存空间的,当定义一个对象c1的时候,成员变量全部分配空间并完成初始化,r为随机值,pi为3.1415926,area直接计算不保留等号右边的算式,因为r随机,那么area自然也是随机值。
   2、后面再输入的r值并不会印象area的结果,因为公式在输入r值之前就已经消失了。那么公式就失去的原本的作用;
     3、因此:结论:在类中直适合直接定义变量(成员变量),如果要定义方法则需要借助成员函数来定义实现。

三、C++和C中register的意义

  register关键字 :修饰变量,请求编译器让变量a直接放在寄存器里面,速度快(注意只是请求建议,register没有资格强迫编译器这么做)
  1、在c语言中 register修饰的变量不能取地址(&a),c编译器不会甄别优化,一般会按照你的建议去干,放在寄存器上的变量不能取地址。(和内存的存储结构和机制有差异)
  2、在c++里面可以取register变量的地址,当你要取register地址的时候,编译器会使register对变量的声明变得无效,因此变量依旧存储在内存上,可以取内存地址。
    3、c++编译器比较智能,会甄别和优化,当需要存在寄存器上时,即使不加register(就是即使没有建议这么干),编译器也会将变量存储至寄存器;相反当没有必要的时候,即使你强加了register声明,编译器也不会照做。甚至如上情况,register被采纳通过了,但是当发现你要取地址的时候,立马让其无效不通过,怎么样,是不是很灵活智能!

 四、struct关键字在C++和C语言中的差异

  在C++中struct关键字类型相较于C语言中,功能得到增强 !

struct teacher
{
    char name[32];
    int age;
};
/*
typedef struct teacher         //作为替换方法typedef不是关注点,但是我也附上
{
    char name[32];
    int age;
}teacher;
*/

//关注点:
struct teacher ang;   //C语言可用  C++可用      
// C原因必须带上struct teacher 整体作为数据类型名

teacher ang;         //C++可用      
//  C++ 不要求必须有struct , teacher 就可以作为数据类型名,
//  但是还是建议协商struct毕竟C语言用法已经习惯了。

上面的代码例子:

  C语言struct用法:缺少struct——不行;typedef替换——也是整体替换而不是单独省掉struct
        1、struct teacher ach;    struct必不可缺,否者C编译器不识别为数据类型
        2、使用typedef        ,将struct  teacher作为类型名整体替换为新类型名,但即便是这样,C语言中struct依旧不可被单独撇下

       C ++  struct用法:C语言能行的都行,C语言不允许的也可以

  五、bool数据类型在C++和C语言中的差异

  布尔类型(bool)是 C++ 新增的一种基本数据类型。在标准的 C语言中没有那个数据类型可以直接定义bool数据。

即:如下代码只能在C++中这样定义,而C语言中不行(C语言中没有bool的定义类型)

bool b1 = true;
bool b2 = false;
bool b3 = 1;
bool b4 = 0;
bool b5 = 54;              //C++可以赋值true、false  也可以赋值 1、0、54(任意数)

在C语言中如果需要使用 bool 类型,程序员可以通过宏定义来自定义一个 bool 类型,定义语句如下:

#define bool int
#define false 0          
//C语言不能使用false、true;并且数据类型一般是int型,没有bool型的定义法

#define true 1

也就是将 int 型定义为 bool 型,将 int 型的 0 和 1 两个值分别定义为 bool 类型的两个值 true 和 false。但是在 C++ 中则不需要这么麻烦,C++ 中对 bool 类型已经做出了定义。

六、三目运算符功能增强(C和C++编译器的表现)

int main()
{
         int a = 10;
         int b = 20;

         //返回一个最小数 并且给最小数赋值成30
         //三目运算符是一个表达式 ,表达式不可能做左值
         (a < b ? a : b )= 30;

         printf("a = %d, b = %d\n", a, b);
         system("pause");
         return 0;
}

结论

1、C语言返回变量的值                C++语言是返回变量本身
    C语言中的三目运算符返回的是变量值,不能作为左值使用*(返回的变量值不能立即被赋值)
    C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方

2、注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
    (a < b ? 1 : b )= 30;

3、C语言如何支持类似C++的特性呢?
    当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值