zoukankan      html  css  js  c++  java
  • C++开发环境和基础语法

    C++的编译环境

      1.在虚拟机中使用g++,可使用如下命令:

    先测试有没有安装g++
        g++ -v
    安装
        sudo apt-get update
        sudo apt-get install g++ 
        g++ -v //用来检查是否安装成功
    

      g++是c++的一种编译器,需要安装,g++的用法和gcc一致,需要更换下载源,不然速度很慢。
      2.使用VS Code加WSL,可参考如下博客:

    https://blog.csdn.net/weixin_37714383/article/details/85239886
    

    C++简介

      上世纪80年代初,由本贾尼在贝尔实验室开始从事将C改良为带类的C(C with classes)的工作,83年被正式命名为C++,在此基础上发展出了GNU C++、微软 C++、ANSI C++和制定了ISO C++98、ISO C++03、ISO C++11、ISO C++14等标准。可以看出C是C++的基础,C++是C的扩展,扩展了以下内容:

    1.面向对象(以类的方式来组织代码)
    2.运算符的重载(一种函数的特殊形式)
    3.异常(一种新的错误处理方法)
    4.泛型编程(类型通用的编程)
    

      C++完全兼容C,但C++属于强类型语言,类型检查严格,所以编程时需要注意,不像C语言一样,类型传递不相符只是报警告而已。

    基础语法

    1.源代码存储

      C++的源代码保存在后缀为.cpp的文件中,头文件的后缀.hpp,也有.cc .C .cxx .c++具体看使用什么样的编译器或者集成开发环境。

    2.C++的头文件

      C++包含系统头文件不再以.h作为结尾

    #include <iostream> ------- 支持输入输出的头文件
    #include <string>
    #include <vector>
    

      C语言的标准头文件仍然可以使用

    #include <stdio.h>
    #include <string.h>
    //但是C++不推荐使用以上语法,要使用标准C库的头文件直接去掉.h再前面加上c就可以了
    #include <cstdio>
    #include <cstring>
    //非标准头文件不支持以上语法
    #include <pthread.h>
    

    3.命名空间


      当一个项目有很多个人同时开发的时候,可能会发生使用了同一个标识符的情况,这样便会导致编译错误,如上图所示使用可命名空间的话,只要空间名不同即使标识符名字一样也不会发生冲突,使用:空间名::成员名 来访问不同空间的内容,::叫做域操作符。

    4.匿名命名空间

      如果一个数据不属于任何命名空间,C++认为该数据处于匿名命名空间,可以使用 ::内容 语法来访问匿名命名空间中的内容,也可以省略::。也可以直接定义匿名命名空间:

    namespace{
        内容;
    }
    

    4.C++的输入和输出

      C++的标准输入输出定义在std的命名空间中,使用C++的输入输出流(包括其他工具)都需要使用命令空间std。

    using namespace std;
    

      上面代码表示需要使用命名空间std,当使用了这行代码时就不需要使用::来进行访问std空间中的内容了,当然前提是用户所定义标识符不会和系统的起冲突

    using namespace std;
    标准输入 ------ cin>>
        cin>>代表空间的内容(变量/地址)
        可以连续输入:cin>>空间1>>空间2>>空间3>>......
    
    标准输出 ------ cout<<
        cout<<可以输出任何非自定义类型的数据,可以连续输出,endl表示换行
        cout<<数据1<<数据2<<数据3<<......<<endl;
    

    实验程序

    #include <iostream>
    
    namespace ns1{
        int num1 = 1;
        int add(int x, int y)
        {
            return x + y;
        }
    }
    
    namespace ns2{  //命名空间可以嵌套使用
        int num2 = 2;
        namespace ns2_1{
            int num3 = 3;
            namespace ns_3{
                int num4 = 4;
            }
        }
    }
    
    int num5 = 5;  //匿名命名空间
    int num6 = 6;
    
    namespace{  //匿名命名空间
        int num7=7;
    }
    
    namespace{
        int num8=8;
    }
    
    using namespace std;
    using namespace ns1;
    int main()
    {
        cout<<"num1:"<<num1<<endl;
        cout<<"sum:"<<add(num1, ns2::ns2_1::ns_3::num4)<<endl;
        cout<<"num5:"<<::num5<<endl;
        cout<<"num6:"<<num6<<endl;
        cout<<"num7:"<<::num7<<endl;
        cout<<"num8:"<<num8<<endl;
    }
    

    输出结果

    5.引用(references)

      引用说白了就是起别名的意思,一般只在定义函数的参数时使用,表示将变量本身传递过去,而不是作为一个形式参数,和指针不同,指针传递的是地址,而引用就是其本身只是被起了别名而已,所以引用作为函数参数可以实现数据的双向传递。

    类型名& 引用名 = ....;//引用必须初始化
    //以上代码就相当于给等号后边的内容起一个别名
    引用既可以指向变量,也可以指向常量
        int num = 10;
        int& r = num;//变量的引用
        const int& cr = 100;//常量的引用
        int *p = xxx;
        int *&rp = p;//指针的引用
        int arr[5];
        int (*r_arr)[5] = arr;//数组的引用
        //数组引用作为函数攒书可以保留数组的特性,也就是可以用sizeof求出它的大小
        //但是丧失了数组传递的灵活性,几乎不使用
        int x = a(...);// 声明为int& a(...); 注意返回的类型也需要是引用的类型
    

    实验程序
      使用引用的方法给一个指针类型分配空间

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    void get_space(double *&p, int size)
    {
        p = new double[size];
    }
    
    int main()
    {
        double *p = 0x00;
        get_space(p, 5);
        cout<<"p address:"<<p<<endl;
        return 0;
    }
    

    输出结果:

    6.内存分配

    new/delete --------- 分配和释放单个内存
    new[]/delete[] ----- 分配和释放多个连续内存
    
    申请一个类型大小的内存
        类型名 *指针变量名 = new 类型;
        类型名 *指针变量名 = new 类型(值);//分配初始化
    释放一个类型大小的内存
        delete 指针变量名;
        
    申请多个同类型大小的内存  
        类型名 *指针变量名 = new 类型[n];//分配n个类型大小的内存
    释放多个同类型大小的内存
        delete[] 指针变量;
    

    7.函数重载(overload)

      C++中函数名相同,形参列表不同的函数构成重载关系,C语言不支持。所谓的参数列表不同,如下所示,调用重载函数时,根据传递的实参来选择合适的函数调用,可知道C++的函数在编译时不但记录函数名,而且记录参数列表,函数调用匹配时,同时匹配函数名和参数列表。所以对于类似功能,在不同数据下可以用一个函数名实现,大大简化上层调用的复杂度。

    参数的个数不同
    参数的类型不同
    参数的顺序不同
    
    int print(int);
    int print(double);
    int print(int,double);
    int print(double,int);
    

      1.C++中参数列表为()表示没有参数,等价于(void);
      2.C++不支持隐式声明,必须前置声明;
      3.C++的函数不在默认返回int,必须指定函数的返回值;
    实验程序
      使用函数重载,实现两个数的加法,两个数可以是整数,浮点数或者一个整数,一个浮点数。

    #include <iostream>
    
    using namespace std;
    
    int add(int a, int b)
    {
        return a + b;
    }
    
    float add(float a, float b)
    {
        return a + b;
    }
    
    float add(int a, float b)
    {
        return a + b;
    }
    
    int main()
    {
        int num1 = 1;
        int num2 = 2;
    
        float f1 = 1.500000;
        float f2 = 2.500000;
    
        cout<<"int add:"<<add(num1, num2)<<endl;
        cout<<"float add:"<<add(f1, f2)<<endl;
        cout<<"int float add:"<<add(num1, f1)<<endl;
    
        return 0;
    }
    

    输出结果:
    image

    8.函数参数的默认值

      函数参数的默认值指的是在调用函数时,如果不提供对应的实参,就选择使用参数的默认值。如果传递了实参,使用实参来覆盖默认值,C++函数的参数可以选择使用默认值。

    返回值类型 函数名(形参类型1 形参名1,形参类型2 形参名2,...,形参类型n 形参名n=默认值)
    {
        .....
    }
    
    1.有默认值的参数必须靠右,一个参数有默认值,其右边的参数都应该有默认值
    2.一个形参有默认值,调用时如果提供实参就使用实参而不使用默认值
      如果不提供实参就使用默认值
    3.使用函数参数默认值时,注意不要和函数重载冲突
    4.如果有函数声明,函数默认值应该写到函数声明中 
    

    实验程序
      打印整数数组的函数,默认打印前5个元素,默认使用逗号作为分隔符,也可以指定打印个数和分隔符。

    #include <iostream>
    
    using namespace std;
    
    void def_p(int (&arr)[10] , char separator = ',', int plen = 5)
    {
        int i;
        for(i = 0; i < plen-1; i++)
        {
            cout<<arr[i]<<separator;
        }
    
        cout<<arr[i]<<endl;
    }
    
    int main()
    {
         int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
         def_p(arr);
    }
    

    输出结果:
    image

    总结

      1.命名空间的作用是对代码进行划分,防止命名冲突,应该避免使用匿名命名空间;
      2.如果函数内部不对引用形参进行修改,应该给引用参数加const;
      3.不能局部变量和非引用形参的引用,可以返回静态、全局、堆、引用参数的引用;
      4.内存分配在C++使用malloc/free,而使用new/delete;
      5.参数列表相同,返回值不同的函数不构成重载函数;
      6.如果一个函数的参数只有类型,没有形参名,这个参数就叫哑元,哑元的作用就用来实现没有参数函数的重载;

  • 相关阅读:
    GitHub 源码,Framework 框架
    转int啥啥啥的
    查看apk签名 和 keystore 的信息
    一次apk打开时报内存溢出错误,故写下内存溢出的各种原因和解决方法
    客户端传值里面包含URL特殊字符的应对方法
    Linux全硬盘搜索文件名是xxxxx的命令
    pythonmysql运行报错解决过程中遇到的其中一个报错解决文章来源
    linux查看硬盘占用情况
    Linux使用nginx反向代理。可实现域名指向特定端口
    Linux下使用yum安装软件命令
  • 原文地址:https://www.cnblogs.com/ding-ding-light/p/14521227.html
Copyright © 2011-2022 走看看