C++与C的区别二

Posted 皓月肥波

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++与C的区别二相关的知识,希望对你有一定的参考价值。

C++与C的区别二

结构体区别

  • 类型上不再需要struct关键字,直接使用结构体名即可

  • C++结构体中允许函数存在

    • 在结构体中声明,在结构体中实现,当然可以在结构体外实现。

    • 学会调用

      • 对象.成员

      • 对象指针->成员

      • (*对象指针).成员

      • (&对象)->成员

    • C++在没有写构造函数和权限限定的时候,用法和C语言的用法是一样

      #include<iostream>
      using namespace std;
      struct calm
      
          char name[35];
          int age;
          void print()
          
              cout << name << "\\t" << age<<endl; //name首地址可输出全部字符串
          
          void printData();
      ;
      void calm::printData()
      
          cout << name << "\\t" << age << endl;
      
      int main()
      
          struct calm boy1 =  "熊大",28 ;
          calm boy2 =  "熊二",27 ;
          boy1.print();
          boy2.print();
          (&boy1)->printData();
          (&boy2)->printData();
      ​
          calm* p = &boy1;
          p->print();
          p->printData();
          (*p).print();
      

动态内存申请

  • C语言的动态内存申请

    • malloc不带初始化,calloc带初始化,realloc重新申请

    • free释放

  • C++的动态申请

    • new和delete

      • 类型* 变量=new 类型

      • 类型* 变量=new 类型(数据元素)

    • 单个变量内存申请

    • 数组的动态申请

    • 结构体内存申请

#include<iostream>
using namespace std;
void test1()

    int* pInt = new int;
    *pInt = 123;
    cout << *pInt << endl;
    char* pChar = new char;
    *pChar = 'A';
    cout << *pChar << endl;
​
    delete pInt;
    pInt = nullptr;
​
    delete pChar;
    pChar = nullptr;

void print(int array[], int arrayNum)

    for (int i = 0; i < arrayNum; i++)
    
        cout << array[i] << " ";
    
    cout << endl;

void test2()

#if 0
​
        malloc(大小)          申请内存不做初始化
        calloc(总数,大小)      初始化全为0,最后申请空间大小为总数 * 大小
        realloc(原有空间地址,重新申请的地址长度)给一个已经分配地址的指针重新分配空间
        memset()函数原型是extern void
            *memset(void *buffer,int c,int count)
            buffer:指针或者数组
            c:给buffer赋的值
            count:是buffer的长度
​
#endif
​
    int* pMnum = (int*)malloc(sizeof(int) * 3); //相对于int pMnum
        if (pMnum == NULL)
        
            return;
        
                                        //判断申请是否成功
        memset(pMnum, 0, sizeof(int) * 3);
        print(pMnum, 3);
​
        int* pCnum = (int*)calloc(3, sizeof(int));
        print(pCnum, 3);
​
        int* pint = (int*)malloc(sizeof(int));
        if (pint == NULL)
            return;
        *pint = 2001;
        pint = (int*)realloc(pint, sizeof(int) * 3);
        pint[1] = 2002;
        pint[2] = 2003;
        print(pint, 3);
        free(pint);

int main()

    test1();
    test2();
#include<iostream>
using namespace std;
void test3()

#if 0
    C++的释放有两种写法
        delete p;      //单个内存
        delete[] p;    //[]代表当前变量是一段内存
#endif 
        int* pNum = new int[3] 1,2,3 ;
        for (size_t i = 0; i < 3; i++)
        
            cout << pNum[i] << " ";
        
        delete pNum;
        char* str = new char[20]'A','B','\\0';
        cout << str<<endl;
        delete[] str;

int main()

    test3();
    return 0;

内存池

  • 允许大家申请一段内存,共给程序使用,综合管理内存

#include<iostream>
using namespace std;
void test4()

#if 0
    malloc内存是在堆区
    new内存是自由存储区
#endif 
    char* memorySum = new char[1024];
    int* pNum = new(memorySum)int[3] 1,2,3 ;
    //char* pstr = new(pNum + 3)char[20] "I Love You" ;与下面语句等价
    char* pstr=new(memorySum+12)char[20] "I Love You" ;
    for (size_t i = 0; i < 3; i++)
    
        cout << pNum[i] << " ";
    
    cout << pstr<<endl;
    for (size_t i = 0; i < 3; i++)
    
        cout << ((int *)memorySum)[i] << " ";
    
    cout << (memorySum+12)<<endl;

int main()

    test4();
    return 0;

String类型

  • string与string.h没有任何关系,string是C++的字符串类头文件,string.h是C处理C字符串类的函数库

    故C++string不能用到C语言的字符串处理函数

  • string的创建

    • 带初始化

    • 不带初始化

    • 通过另一个字符串创建

  • string的基本操作

    • 拷贝

    • 赋值

    • 连接

    • 比较

  • C++如何转换为C语言的char*

    #include<iostream>
    using namespace std;
    int main()
    
        string str1;
        str1 = "I Love You";  //C++中没有记录\\0
        cout << str1 << endl;
    ​
        string str2("I Love You");
        cout << str2 << endl;
    ​
        string str3="I Love You";
        cout << str3 << endl;
    ​
        //拷贝
        string str4(str3);
        cout << str4 << endl;
        //赋值
        string str5=str4;
        cout << str5 << endl;
        //连接
        string str6="one";
        string str7="two";
        string str8=str6+str7;    //等效string str8=str6.append(str7);
        cout << str8 << endl;
        //比较(> < != ==)       //等效str6.compara(str7) 0 -1 1
        if (str6 > str7)
        
            cout << "大的" << str6 << endl;
        
        else
        
            cout << "小的" << str6 << endl;
        
    ​
    ​
        //C++如何转换为C语言的char* ,c_str()、data()函数
        string ptr1 = "I Love You";
        //printf("%s", ptr1);       乱码
        printf("%s\\n", ptr1.c_str());
        printf("%s\\n", ptr1.data());          //按F1    string类的成员函数
        return 0;
    
    #include<iostream>
    using namespace std;
    int main()
    
    #if 0
        为啥char* 类型赋值字符串的时候要用到const
        C++对const要求更严格两边必须类型一致
            指针变量=常量地址
        char* ptr = "I Iove You"; 报错
        
    ​
    #endif 
         
        const char* ptr = "I Iove You";
        return 0;
    

作业

  • C版本

#include <string.h>
#include <stdio.h>
#include <stdlib.h>       //malloc
int** createArray2D(int row, int cols)               //row行 col列

    int** pArray = (int**)malloc(sizeof(int*) * row);//申请二级指针,二级指针本质是多个一级指针
    if (pArray == NULL)
        return NULL;
    for (int i = 0; i < row; i++)
    
        pArray[i] = (int*)malloc(sizeof(int) * cols);//给一级指针申请
    
    return pArray;

//有兴趣的可以用传参的方式
void mallocArray2D(int*** pArray, int row, int cols)

​

int main()

    int** p = createArray2D(4, 3);
    for (int i = 0; i < 4; i++)
    
        for (int j = 0; j < 3; j++)
        
            p[i][j] = i * j;             //赋值
            printf("%d\\t", p[i][j]);     //输出
        
        printf("\\n");
    
    return 0;
  • C++版本

#include<iostream>
using namespace std;
​
int** createArray2D(int row, int cols)               

    int** pArray =new int*[row];
    if (pArray == NULL)
        return NULL;
    for (int i = 0; i < row; i++)
    
        pArray[i] = new int [cols];          //给一级指针申请
    
    return pArray;

​
int main()

    int** p = createArray2D(4, 3);
    for (int i = 0; i < 4; i++)
    
        for (int j = 0; j < 3; j++)
        
            p[i][j] = i * j;             //赋值
            printf("%d\\t", p[i][j]);     //输出
        
        printf("\\n");
    
    return 0;

以上是关于C++与C的区别二的主要内容,如果未能解决你的问题,请参考以下文章

java 如何区分一代二代身份证照片

C++ 程序员到高级架构师,必须经历的三个阶段

C++语言const_iterator和const iterator的区别,

为什么二代测序的原始数据中会出现Read重复现象?

C++与C的区别终于说清楚了!

C++和VisualC++有啥区别?