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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪八戒1.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值