c语言之malloc函数详解 C++ 和 C 的区别

 2024-03-06 00:06:41  阅读 0

C++ 和 C 之间的差异概述

C++是在C语言基础上发展起来的一种编程语言。 它在语法、数据类型、函数、运算符等方面比C语言更加丰富和灵活,并且对面向对象编程也有更好的支持。 (OOP)能力,它被广泛应用于各种系统和应用程序的开发。 以下是 C++ 和 C 语言之间的一些主要区别:

以上只是C和C++之间的一些简单区别。 事实上,它们在许多方面都有相似的语法和功能。 对于学习者来说,如果已经掌握了C语言,那么学习C++会更容易一些,因为C++的语法和特性可以看作是C语言的扩展和补充。 接下来我们就详细学习一下C++和C在基础阶段必须掌握的一些区别。

C++和C的区别详解

C++ 和 C 的区别

动态内存分配

C++中的动态内存申请与C语言中的动态内存申请类似。 需要使用关键字new或者对应的类型占位符来分配内存空间,使用关键字或者free来释放内存。 然而,两者之间也存在一些差异,如下:

动态内存应用 | 申请单变量内存

在空闲存储区创建一个变量,让指针指向该变量。 基本语法:类型*名称=新类型; 测试代码如下:

#include 
int main()
{
  int* p1 = (int*)malloc(sizeof(int));
  free(p1);
  p1 = nullptr;
  //申请
  int* p2 = new int;
  *p2 = 123;
  delete p2;
  //申请内存并且给予初始化
  int* p3 = new int(123);
  std::cout << *p3 << std::endl;
  delete p3;
  return 0;
}

动态内存应用 | 申请一段内存

申请一段内存,然后将内存首地址赋给指针,通过指针偏移实现数据访问。 当然,也可以直接使用数组下标方法。 基本语法:type* name = new type[size]; 测试代码如下:

#include 
int main()
{
  //数字类
  int* array = new int[3];
  for (int i = 0; i < 3; i++)
  {
    array[i] = i;
    std::cout << array[i] << " ";
  }
  std::cout << std::endl;
  //释放一段内存
  delete[] array;
  //申请并且初始化
  array = new int[3] {1, 2, 3};
  for (int i = 0; i < 3; i++)
  {
    std::cout << array[i] << " ";
  }
  std::cout << std::endl;
  //字符串处理
  char* pstr = new char[20] { "C++动态内存申请" };
  std::cout << pstr << std::endl;
  delete[] pstr;
  return 0;
}

动态内存应用| 申请内存重新分配操作

C++允许提前申请内存,然后在分配的内存上进行分配。 基本语法: type* name = new(src) type; 或 type* name = new(src) type[size];

#include 
int main()
{
  //允许申请的内存做重新分配
  char* p = new char[1024];
  //new(申请位置) 类型[长度]{初始化};
  int* pInt = new(p + 0) int[3] {1, 2, 3};    
  char* pStr = new(p + 12) char[10] { "再申请" };
  for (int i = 0; i < 3; i++)
  {
    std::cout << pInt[i] << std::endl;
  }
  std::cout << pStr << std::endl;
  delete[] p;
  return 0;
}

在C++中,我们可以通过重载关键字new来自定义内存管理机制,实现自定义的内存分配和释放方法。 但一般不建议采用这种方法,因为它过于复杂,而且很容易造成难以诊断的错误。 随后将详细解释该运算符重载。

C++ 类型转换

C++中的类型转换分为两种方法:隐式类型转换和显式类型转换。 所有显式类型转换的基本语法是:类型转换运算符(转换目标);

注意:在进行显式类型转换时,应谨慎使用,避免类型转换带来的错误。 特别是其使用范围较小,使用场景必须明确,谨慎对待。

C++ 类型转换 |

它用于基本数据类型、类继承和派生(稍后解释)、多态上转换(稍后解释)以及其他可以在编译时确定的类型转换。 测试代码如下:

#include 
int main()
{
  //基本数据转换
  int num = static_cast(1.3);
  //C语言
  int c_num = (int)1.3;
  //C++
  int cpp_num = int(1.3);
  void* pNum= #
  //指针类型转换
  std::cout << *static_cast(pNum) << std::endl;
  //增加const属性
  const int& number = static_cast(num);
  //不能去掉const属性
  //以下都报错
  //int& test = number;
  //int& test = static_cast(number);
  return 0;
}

C++ 类型转换 |

用于从标识符中删除 const 属性或属性,或将常量指针转换为非常量指针。 测试代码如下:

#include 
int main()
{
  const int number = 123;
  //不能去掉const属性
  //以下都报错
  //int& test = number;
  //int& test = static_cast(number);
  //正确写法
  //去掉const属性
  int& test = const_cast(number);
  //增加const
  int data = 123;
  //const_cast增加const属性只能用于指针或者引用
  //以下两种错误
  //const int num = const_cast(data);
  //const int num = const_cast(data);
  const int& num = const_cast(data);
  return 0;
}

C++ 类型转换 |

指针之间的转换不执行任何类型检查,仅重新解释位,并允许编译器在类型转换期间执行非常规的位操作。 测试代码如下:

#include 
void print() 
{
  std::cout << "reinterpret_cast" << std::endl;
}
int main()
{
  //错误代码
  //int num = print;
  //指针转整数
  long long num = reinterpret_cast(print);
  std::cout << num << std::endl;
  //整数转指针
  typedef void(*Func)();
  auto pFunc = reinterpret_cast(num);
  pFunc();
  return 0;
}

C++ 类型转换|

用于运行时的多态类型转换。 (稍后解释)

C++结构类型

后续C++类中的大部分C++结构体都可以使用,C++结构体也可以作为类使用。 例如,可以完成对类中结构体的如下操作:

现在,了解简单的差异就足够了。

C++ 结构 | 类型改变

使用类型时,C++ 结构不再需要关键字。 您可以直接使用结构名称。 测试代码如下:

#include 
struct MM
{
  char name[20];
  int age;
};
int main()
{
  //C语言
  struct MM mm = { "baby",18 };
  //cpp
  MM girl = { "girl",20 };
  //new一个MM
  MM* pMM = new MM;
  return 0;
}

C++ 结构 | 成员变动

C++ 结构体可以同时包含数据成员和函数成员。 通常结构体中的函数可以称为成员函数。 访问方法与数据成员访问方法相同,测试代码如下:

#include 
struct MM
{
  char name[20];
  int age;
  void print()
  {
    std::cout << name << " " << age << std::endl;
  }
};
int main()
{
  MM mm = { "baby",18 };
  mm.print();
  return 0;
}

C++ 结构 | 结构体中声明,结构体外实现的函数

函数在C++结构体中声明,在结构体之外实现的函数需要使用结构体名::进行限定,如下面的测试代码所示:

#include 
struct MM
{
  char name[20];
  int age;
  void print();
};
//外面实现需要结构体名限定
void MM::print() 
{
  std::cout << name << " " << age << std::endl;
}
int main()
{
  MM mm = { "baby",18 };
  mm.print();
  return 0;
}

C++ 类型

C++类型本质上是类类型,所以暂时掌握一些常用的使用方法就足够了。 没有必要去追究那么多原因。 学习完所有后续的类和对象后,您可以尝试实现一个简单的类来获得乐趣。

C++ 类型 | 声明和初始化

C++的声明和初始化都比较简单。 使用类型时,记得包含头文件:#; 它可能与.h不同,如以下代码所示:

#include 
#include 
int main()
{
  std::string  str1;
  std::string  str2("string");
  std::string  str3 = "string";
  std::string   str4 = str3;
  std::string  str5(str3);
  return 0;
}

C++ 类型 | 遍历

C++不能直接操作C语言函数和字符串处理函数。 您需要调用 c_str 或 data 函数才能使用它。 在C++中,可以直接操作cout和cin。 当然,也可以直接支持下标访问单个字符。 测试代码如下:

#include 
#include 
#include 
int main()
{
  //下标法访问
  std::string str = "coolmoying";
  for (int i = 0; i < str.size(); i++)
  {
    std::cout << str[i];
  }
  std::cout << std::endl;
  //at函数下标法
  for (int i = 0; i < str.size(); i++)
  {
    std::cout << str.at(i);
  }
  std::cout << std::endl;
  //区间遍历
  for (auto v : str)
  {
    std::cout << v;
  }
  std::cout << std::endl;
  //C语言操作
  std::printf("%s\n", str.c_str());
  std::puts(str.data());
  //迭代器遍历  后续讲解
  std::string::iterator iter;
  for (iter = str.begin(); iter != str.end(); iter++) 
  {
    std::cout << *iter;
  }
  std::cout << std::endl;
  return 0;
}

C++ 类型 | 字符串比较和连接

C++中可以直接使用运算符进行比较,也可以直接使用+运算符进行连接。 当然,你也可以调用函数,如下测试代码所示:

#include 
#include 
#include 
int main()
{
  //判断
  std::string  str1 = "moolying";
  std::string  str2 = "coolmoying";
  std::cout << (str1 == str2) << std::endl;
  std::cout << (str1 < str2) << std::endl;
  std::cout << (str1 > str2) << std::endl;
  std::cout << (str1 != str2) << std::endl;
  std::cout << (str1 <= str2) << std::endl;
  //调用函数的形式
  //类似strcmp
  bool result = str1.compare(str2);
  //连接
  std::string str3 = str1 + str2;
  std::cout << str3 << std::endl;
  std::cout << str1 << std::endl;
  //函数的形式会更改原来的字符串
  std::cout << str1.append(str2) << std::endl;
  std::cout << str1 << std::endl;
  return 0;
}

C++ 类型 | 其他功能操作

C++包含大量的成员函数。 如果有兴趣可以查看MSDN帮助文档。 下面介绍一些简单、实用、常用的功能。 测试代码如下:

#include 
#include 
#include 
int main()
{
  std::string  str= "moolying";
  //长度
  std::cout << "size:" << str.size() << std::endl;
  std::cout << "length:" << str.length() << std::endl;
  //插入字符
  str.insert(str.begin(), 'A');
  //尾部插入
  str.push_back('D');
  //end():结束位置不是最后一个元素的位置
  std::cout << "第一个字符:" << str.front() << std::endl;
  std::cout << "第一个字符:" << *str.begin() << std::endl;
  std::cout << "最后一个字符:" << str.back() << std::endl;
  std::cout << "最后一个字符:" << *(str.end() - 1) << std::endl;
  //str="coolmoying";
  std::cout << "查字串:" << str.find("ying") << std::endl;
  //substr(起始下标,截取个数);
  std::cout << "截取:" << str.substr(4, 2) << std::endl;
  return 0;
}

C++ 类型 | 其他

C++提供了可以将数字转换为字符串的方法,测试代码如下:

#include 
#include 
int main()
{
  std::cout << std::to_string(1.111) << std::endl;
  std::string request = "request " + std::to_string(12.13) + "\r\n";
  std::cout << request << std::endl;
  return 0;
}

有关的

如果你正好在学习C/C++,看文章很无聊,不妨关注一下小编的视频教程。 它们很容易理解,并且用简单的方式解释深奥的事情。 每个视频只讲一个知识点。 视频内容并不深奥,无需学习。 公交车上、地铁里、厕所里都可以观看,随时随地改善姿势。

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码