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