美文网首页NDK开发
NDK----C++篇(一) C++与C语言比较学习

NDK----C++篇(一) C++与C语言比较学习

作者: 初夏的雪 | 来源:发表于2021-06-15 07:54 被阅读0次

    前面一段时间我们学习了NDK开发的C语言的一些知识,从今天开始我们学习C++的知识,今天我们采用C语言和C++对比的方式来认知一下C++.这篇文章篇理论的东西比较多,看着有点枯燥,如果有理解不了的,暂时跳过,后面的文章中来逐步学习解释。

    对比:

    1、C++是标准的面向对象的语言,C语言是面向过程的语言;

    2、C++的标准支持库#include <iostream> , C语言的标准支持库#include<stdio.h>;

    3、C++可以运行C语言,可以调用C语言,反之:C语言不能调用C++;

    4、C++ 增加了命名空间的特性;

    5、C++支持函数重载,而C语言不支持函数重载;

    6、C和C++中的bool 值,都是非0即true ,否则是false;

    7、栈区开辟的空间在函数弹栈会释放掉,堆区开辟的空间需要在使用结束后手动释放掉;

    1、命名空间及其自定义

    命名空间时C++引入的一个范围限制的概念,类似于作用域的限定;C++库提供了命名空间及其内部的API ,当然我们也可以自定义命名空间。

    说明:

    1、命名空间使用namesapce + 名字来进行自定义;

    2、命名空间内部可以嵌套N层自定义命名空间,通过::进行多层嵌套调用;

    3、通过可以使用using namesapce 来引入,调用空间内的函数时,就不需要命名空间名称+:: 来限定;

    示例代码:

    namespace CustomNameSpace{
        namespace InnerLayer{
            void innerShow(){
                cout<<"内部嵌套的命名空间函数innerShow()被调用"<<endl;
            }
        }
        void show(){
            cout<<"自定义命名空间里面的show()被调用"<<endl;
        }
    }
    
    int main(){
         CustomNameSpace::InnerLayer::innerShow();
         CustomNameSpace::show();
        
        return 0;
    }
    
    /**
    *输出结果:
    *   内部嵌套的命名空间函数innerShow()被调用
    *   自定义命名空间里面的show()被调用
    */
    

    2、C语言与C++中的真假常量

    C语言中的常量其实是个假常量,可以通过指针修改;而C++中的常量则不然,编译不通过或者运行报错

    示例代码:

       int main(){
            const int number = 100;
            printf("C语言const number 的值是:%d, \n",number );
            int * numP = &number;
            *numP = 10000;
            printf("C语言通过指针修改常量的值:%d\n", number);
           return 0;
       }
        
       /**
         * 输出的结果:
         * C语言const number 的值是:100,
         * C语言通过指针修改常量的值:10000
         */
        
    

    3、C++中的引用(非常重要)

    说明:

    1、C++的引用其实用就是别名或者绰号的意思,其实和他所引用的对象都是指向同一块地址

    2、常量引用(const int& ) :该引用变量变成只读

    //直接参数交换-不成功
    void switchNumber(int number1, int number2) {
        cout<<"number1 的地址是:"<<&number1<<",number2的地址是:"<<&number2<<endl;
        int temp = number1;
        number1 = number2;
        number2 = temp;
    }
    
    //指针交换
    void switchNumber1(int* number1, int* number2) {
        cout<<"number1 的地址是:"<<number1<<",number2的地址是:"<<number2<<endl;
        int temp = *number1;
        *number1 = *number2;
        *number2 = temp;
    }
    
    //引用交换
    void switchNumber2(int& number1, int& number2) {
        cout<<"number1 的地址是:"<<number1<<",number2的地址是:"<<number2<<endl;
        int temp = number1;
        number1 = number2;
        number2 = temp;
    }
    
    
    //常量引用
    typedef struct {
        char name[20];
        int age;
    }Student;
    
    void insertStudent(const Student & student)//常量引用,在函数体内部能修改student的值,只能读取
    {
    //    Student  student1={"bbbbb",2};
    //    student=student1;//常量引用不能修改
        cout << student.name << "," << student.age << endl;
    }
    
    int main(){
        int number1 = 100;
        int number2 = 200;
        cout<<"*****switchNumber直接交换值*******"<<endl;
        cout << "交换之前的两个数:number1=" << number1 << " 的地址:"<<&number1<<", number2=" << number2 << " 的地址:"<<&number2<< endl;
        switchNumber(number1, number2);
        cout << "交换之后的两个数:number1=" << number1<< " 的地址:"<<&number1 << ", number2=" << number2 << " 的地址:"<<&number2<< endl;
        cout<<endl;
        cout<<endl;
        
        cout<<"*****switchNumber1  指针交换*******"<<endl;
        cout << "交换之前的两个数:number1=" << number1 << " 的地址:"<<&number1<<", number2=" << number2 << " 的地址:"<<&number2<< endl;
        switchNumber1(&number1, &number2);
        cout << "交换之后的两个数:number1=" << number1<< " 的地址:"<<&number1 << ", number2=" << number2 << " 的地址:"<<&number2<< endl;
        cout<<endl;
        cout<<endl;
        
        cout<<"*****switchNumber2 引用交换*******"<<endl;
        cout << "交换之前的两个数:number1=" << number1 << " 的地址:"<<&number1<<", number2=" << number2 << " 的地址:"<<&number2<< endl;
        switchNumber2(number1, number2);
        cout << "交换之后的两个数:number1=" << number1<< " 的地址:"<<&number1 << ", number2=" << number2 << " 的地址:"<<&number2<< endl;
        cout<<endl;
        cout<<endl;
        
        
        //常量引用
         Student  student={"aaaa",1};
        insertStudent(student);
        
        return 0;
    }
    
    
     /**
         * 输出结果:
         * *****switchNumber直接交换*******
         * 交换之前的两个数:number1=100 的地址:0x61fe1c, number2=200 的地址:0x61fe18
         * number1 的地址是:0x61fdf0,number2的地址是:0x61fdf8
         * 交换之后的两个数:number1=100 的地址:0x61fe1c, number2=200 的地址:0x61fe18
         *
         * *****switchNumber1  指针交换*******
         * 交换之前的两个数:number1=100 的地址:0x61fe1c, number2=200 的地址:0x61fe18
         * number1 的地址是:0x61fe1c,number2的地址是:0x61fe18
         * 交换之后的两个数:number1=200 的地址:0x61fe1c, number2=100 的地址:0x61fe18
         *
         *
         * *****switchNumber2 引用交换*******
         * 交换之前的两个数:number1=200 的地址:0x61fe1c, number2=100 的地址:0x61fe18
         * number1 的地址是:200,number2的地址是:100
         * 交换之后的两个数:number1=100 的地址:0x61fe1c, number2=200 的地址:0x61fe18
         */
    

    4、函数重载的二义性

    说明:

    1、若重载函数的参数类型相同,参数数量不同,但是多出的参数有默认值,或者是所有的参数都有默认值,这样会导致函数二义性的问题

    2、函数重载,有默认值的参数必须全部在无默认值的参数后面

    3、参数数据类型不一致时,不会导致二义性

    示例代码:

    
    int add(int number1,int number2){
    
    }
    
    int add(int number1,int number2,int number3=0)
    {
    //1、默认值参数必须在无默认值的参数后面
    //2、有二义性
    }
    
    int add(bool  a ,bool  b)
    {
    //此函数无二义性
    }
    
    int main(){
        add(1,2);//此时会出现二义性
        return 0;
    }
    

    5、常量指针,指针常量,常量指针常量的深入理解

    说明:

    1、常量指针:该指针指向的是一个“常量”,不允许修改“常量”的值,但是该指针可以重新指向

                      **const int*  number=....**
    

    2、指针常量:该指针是一个常量,只能指向一个地方,不能重新指向,但是可以修改指向的内存的值

                      **int* const number=...**
    

    3、常量指针常量:明该指针是一个常量,该指针所指的也是一个“常量”,所以不能重新指向,也不能修改内存的值

                      **const int * const number=....**
    

    实例代码:

    int main(){
        int number = 100;
        int number2 = 200;
        //常量指针
        const int *numberP1 = &number;
    //    *numberP1 = 999;//不允许修改指向的内存值
        numberP1 = &number2;//可重指向
    
        //指针常量
        int* const numberP2=&number;
    //    numberP2=&number2;//不允许重指向
        *numberP2=666;//可可以指向的内存值
    
        //常量指针常量
        const int* const numberP3=&number;
    //    numberP3=&number2;//不允许重指向
    //    *numberP3=888;//不允许修改指向的内存的值
        return 0;
    }
    

    下节预告:C++的一些特殊的知识点

    相关文章

      网友评论

        本文标题:NDK----C++篇(一) C++与C语言比较学习

        本文链接:https://www.haomeiwen.com/subject/sbfyjltx.html