C++编程中删除运算符与相等运算符的使用解析

 更新时间:2016年01月14日 15:30:38   投稿:goldensun  
这篇文章主要介绍了C++编程中删除运算符与相等运算符的使用解析,delete和==以及!=运算符的使用是C++入门学习中的基础知识,需要的朋友可以参考下

delete删除运算符
释放内存块。
语法

[::] delete cast-expression
[::] delete [ ] cast-expression

备注
cast-expression 参数必须是指向以前分配给使用 new 运算符创建的对象的内存块的指针。 delete 运算符的结果类型为 void,因此它不返回值。例如:

CDialog* MyDialog = new CDialog;
// use MyDialog
delete MyDialog;

对指向不使用 new 分配的指针使用 delete 将产生不可预知的结果。但是,可以对值为 0 的指针使用 delete。此设置意味着,当 new 失败并返回 0 时,删除已失败 new 操作的结果不会造成损害。
new 和 delete 运算符还可用于内置类型(包括数组)。如果 pointer 指的是某一数组,请在 pointer 前放置空括号:
int* set = new int[100];
//use set[]
delete 运算符delete [] set;
对对象使用 delete 运算符将释放其内存。在删除对象后取消引用指针的程序可能会产生不可预知的结果或崩溃。
将 delete 用于释放 C++ 类对象的内存时,将在释放该对象的内存之前调用该对象的析构函数(如果该对象具有析构函数)。
如果 delete 运算符的操作数是可修改的左值,则在删除该对象后未定义其值。
使用 delete
有两个语法变体:一个针对单一对象,另一个针对对象数组。以下代码片段演示了它们之间的差异:

// expre_Using_delete.cpp
struct UDType 
{
};

int main()
{
  // Allocate a user-defined object, UDObject, and an object
  // of type double on the free store using the
  // new operator.
  UDType *UDObject = new UDType;
  double *dObject = new double;
  // Delete the two objects.
  delete UDObject;
  delete dObject; 
  // Allocate an array of user-defined objects on the
  // free store using the new operator.
  UDType (*UDArr)[7] = new UDType[5][7];
  // Use the array syntax to delete the array of objects.
  delete [] UDArr;
}

以下两种情况会生成未定义的结果:在对象中使用 delete 的数组形式 (delete [ ]),并在数组中使用 delete 的非数组形式。

delete 的工作方式
将调用函数运算符 delete。
对于不是类类型(class、struct 或 union)的对象,将调用全局 delete 运算符。对于类类型的对象,如果删除表达式以一元范围解析运算符 (::) 开始,则会在全局范围中解析释放函数的名称。否则,delete 运算符将在释放内存之前为对象调用析构函数(如果指针不为 null)。可为每个类定义 delete 运算符;如果给定类不存在这种定义,则会调用全局 delete 运算符。如果删除表达式用于释放其静态对象具有虚拟析构函数的类对象,则将通过对象的动态类型的虚拟析构函数解析释放函数。


相等运算符:== 和 !=

语法

   expression == expression
expression != expression

备注
二元相等运算符将严格比较其操作数的相等性或不相等性。
相等运算符(等于 (==) 而不等于 (!=))的优先级低于关系运算符的优先级,但其行为类似。这些运算符的结果类型为 bool。
如果这两个操作数具有相同的值,则相等运算符 (==) 返回 true (1);否则返回 false (0)。如果操作数不具有相同的值,则不相等运算符 (!=) 返回 true;否则返回 false。
!= 的运算符关键字
not_eq 运算符是 != 的文本等效项。访问程序中的 not_eq 运算符的方式有两种:包括头文件 iso646.h,或使用 /Za(禁用语言扩展)编译器选项进行编译。

// expre_Equality_Operators.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;

int main() {
  cout << boolalpha
     << "The true expression 3 != 2 yields: "
     << (3 != 2) << endl
     << "The false expression 20 == 10 yields: "
     << (20 == 10) << endl;
}

相等运算符可比较指向同一类型的成员的指针。

相关文章

  • 深入理解线程安全与Singleton

    深入理解线程安全与Singleton

    在编译器未优化的情况下顺序如下:1.new operator分配适当的内存;2.在分配的内存上构造Singleton对象;3.内存地址赋值给_instance
    2013-09-09
  • C语言中实现协程案例

    C语言中实现协程案例

    这篇文章主要介绍了C语言中实现协程案例,本文通过将协程与线程和异步回调进行对比,以及具体实现案例,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言高效实现向量循环移位

    C语言高效实现向量循环移位

    这篇文章主要为大家详细介绍了C语言高效实现向量循环移位,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C语言如何正确的终止正在运行的子线程

    C语言如何正确的终止正在运行的子线程

    这篇文章主要介绍了C语言如何正确的终止正在运行的子线程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • C++无法打开源文件bits/stdc++.h的问题

    C++无法打开源文件bits/stdc++.h的问题

    这篇文章主要介绍了C++无法打开源文件bits/stdc++.h的问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • c++动态内存管理与智能指针的相关知识点

    c++动态内存管理与智能指针的相关知识点

    为了更容易同时也更安全地使用动态内存,新的标准库提供了两种智能指针(smart pointer)类型来管理对象,下面这篇文章主要给大家介绍了关于c++动态内存管理与智能指针的相关知识点,需要的朋友可以参考下
    2022-03-03
  • 基于C++ list中erase与remove函数的使用详解

    基于C++ list中erase与remove函数的使用详解

    本篇文章是对C++ list中erase与remove函数的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++中实现队列类链式存储与栈类链式存储的代码示例

    C++中实现队列类链式存储与栈类链式存储的代码示例

    这篇文章主要介绍了C++中实现队列类链式存储与栈类链式存储的代码示例,通过注释来说明,直接上代码,简单粗暴XD 需要的朋友可以参考下
    2016-03-03
  • C++ Boost.Range与Adapters库使用详解

    C++ Boost.Range与Adapters库使用详解

    这篇文章主要介绍了C++ Boost.Range与Adapters库使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-11-11
  • C语言安全编码数组记法的一致性

    C语言安全编码数组记法的一致性

    这篇文章主要介绍了C语言安全编码数组记法的一致性,需要的朋友可以参考下
    2014-07-07

最新评论