C++_03_C++的增强 - 重写版

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

1、C++相较于C,全局变量检查增强
#include<stdio.h>
int m=20;    //先定义
int m;       //再声明
int main()
{
        printf("m = %d\n",m);  //m=20
        return 0;
}
//严格意义上来说,先定义后声明是错误的逻辑
//但是C语言作为弱语法语言,对于先定义再声明的逻辑检查就没有那么严格;
//在C语言里,虽然这样写编译器不会报错,但是不要这样写
//先定义,后再声明,那这个声明根本没有任何意义
 
#include<iostream>
using namespace std;
int n = 34;
int n;            //err
int main()
{
        cout << n << endl;  //err
        return 0;
}
//C++不允许出现先定义再声明的情况,
//因为这是个错误的逻辑,C++针对这方面很严谨,作为强语法语言,全局变量检查得到增强

C++的全局变量检测更强,部分代码出现全局变量先定义,后再声明的情况,C语言作为弱检测性语言,不会检测出错误;但是C++是强检测性语言会检测出更多的错误和语法逻辑问题

 
2、C++相较于C,C++在定义和使用变量的时候更”实用“
  C语言中的变量理论上都必须在作用域开始的位置定义!!即:必须先全部定义初始化完成后在使用;而不能先定义一部分,在执行后面语句的时候突然想起再定义。(理论上是不可以的,但部分编译器也会编译通过)
  C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。随时需要的时候再随时定义即可。
  简单来讲就是C语言比较讲规矩,墨守成规,大家默认的规则就是先在指定的地方集中先定义初始化,后面在直接用;而C++比较机灵,C++的一切行径都是为了实用而不是为了美观或者规范,因为大家编代码的时候,可能你并不知道你后面会用到那些变量,扎堆定义确实是比较麻烦的,当然也是美观度,但是不够实用。
  C++就是最求实用,比如在for循环中 for(int i=0;i<10;i++)  在C++中是完全没问题的,但是在C语言里,直接在循环里定义变量就可能会报错了。
 
3、C++相较于C,所有变量和函数必须有类型
  C++中任何函数和变量一定要声明类型,但C语言有时候没有明确声明也能变异通过
 
4、C++相较于C,具备更严格的类型转换
  C++具有更严格的类型转换,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;

    //area不是等价于公式,而是计算出来的一个值
    cout << c1.area << endl;    //乱码

    system("pause");
    return 0;
}

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

#include<iostream>
using namespace std;

class A
{
public:
    int length;
    int breadth;
    int height;
    int fun();  //成员函数声明

private:

};

int main()
{
    A asd;
    asd.fun();
    return 0;
}

//成员函数定义:
//        这里引用成员函数的意义就是让计算方法在类的内部再进行一层封装;
//        这样创建的对象还会保留计算方法本身
// 反而不定义成员函数:
//        直接在类内进行计算方法定义,在创建对象的时候会被计算为等式左值,计算方法不会保留
int A::fun()  
{
    cout << "请分别输入长、宽、高:" << endl;
    cin >> length >> breadth >> height;
    int V = length * breadth * height;
    cout <<"体积:"<< V << endl;
    return 0;
}

 

三、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语言不允许的也可以

  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++编译器的表现)

//03-左值.c
#include<stdio.h>

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

    //C语言内,左边返回的是常亮10 ;false
    (a < b ? a : b) = 30; //err
    printf("a = %d, b = %d\n", a, b);
    return 0;
}
//03-左值.cpp
#include<iostream>
using namespace std;

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

    //C++内,三目运算符 左边返回的是变量 a ;true
    (a < b ? a : b) = 30; //a = 30
    cout <<"a = "<< a <<"\t"<< "b = " << b << endl;
    //a = 30  b = 20
    system("pause");
    return 0;
}

 

结论

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

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

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

七、面向过程语言和面向对象语言初识

1、C语言是面向过程的语言;
       核心思想:功能分解、自顶向下、逐层细化( 程序=数据结构+算法 )
       数据结构:对数据的存储方法(数据类型、数组、链表、树等)
       算法:对存储好的数据,进行分析的步骤,操作数据的步骤。
2、C++语言既可以面向过程,也可以面向对象进行程序设计;
       比C语言更适合大型的程序设计;具备:继承、封装、多态的特性;
       在C++的概念里:算法和数据结构被看做是一个整体,被称作对象;
               对象=算法+数据结构   程序=对象+对象+....+对象;

 

posted @ 2023-11-05 22:51  尘落曦枫  阅读(47)  评论(0)    收藏  举报