首页 > 编程语言 >C++ 禁用类的拷贝构造函数和赋值运算符

C++ 禁用类的拷贝构造函数和赋值运算符

时间:2024-08-09 09:16:08浏览次数:8  
标签:函数 禁用 C++ 运算符 Basic 构造函数

C++中如果没有显式定义类的构造函数和赋值运算符,编译器会自动生成对应的函数,但是对于一些含有指针成员变量的类,自动生成的成员函数只会进行浅拷贝,会导致动态申请的内存在对象析构的时候double free,引起崩溃的问题。
因此如果没有必要,通常会禁用该接口,避免用户调用该接口造成问题。
禁用的方式主要有两种:

一、C++11 中可以直接使用 =delete 来禁用该接口

class Basic
{
public:
    Basic();

    // 禁用拷贝构造函数
    Basic(const Basic& bs) = delete;
    // 禁用赋值运算符
    Basic& operator=(const Basic& bs) = delete;

    ~Basic();

private:
    int num1;
    int* p1;
};

此时用户将无法调用该接口,否则会编译报错
delete 除了可以应用于类的成员函数,也可以应用于非成员函数


二、将其声明为私有的成员函数

另一种方式就是将其声明为私有的成员函数,然后只是声明,无需进行定义(C++中的函数可以只进行声明,而无需定义,只要该函数不被调用就可以正常编译,如果被调用的话,就会出现链接错误)。

class Basic
{
public:
    Basic();
    ~Basic();

private:
    Basic(const Basic& bs); // 拷贝构造函数声明为私有
    Basic& operator=(const Basic& bs); // 赋值运算符声明为私有

private:
    int num1;
    int* p1;
};

通过这种方式外部将无法调用该接口


参考资料:
Prefer deleted functions to private undefined ones.

标签:函数,禁用,C++,运算符,Basic,构造函数
From: https://www.cnblogs.com/Jeffxu/p/18350147

相关文章

  • nodejs语言,MySQL数据库;springboot的个性化资讯推荐系统66257(免费领源码)计算机毕业设计
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,个性化资讯推荐系统当然也不能排除在外。个性化资讯推荐系统是以实际运用为开发背景,运用软件工程原理和开发方法,采用springboot技术构建的一个管理系统。整......
  • c#语言,SQL server数据库;基于Web的社区人员管理系统的设计与实现36303(免费领源码)计算机
    目 录摘要1绪论1.1慨述1.2课题意义1.3B/S体系结构介绍1.4ASP.NET框架介绍2 社区人员管理系统分析2.1可行性分析2.2系统流程分析2.2.1数据增加流程2.2.2数据修改流程52.2.3数据删除流程52.3系统功能分析62.3.1功能性分析62.3.2非功能性......
  • 哪种编程语言更适合学习数据结构和算法:C++、Java 还是 Python?
    作为一名工程专业的学生,​​我正在尝试决定使用哪种编程语言来学习数据结构和算法(DSA)。我正在考虑C++,它提供高性能和强大的标准模板库,但对于初学者来说可能很复杂。Java具有强大的语法和内置集合,使DSA概念更容易掌握,尽管我不确定它与C++相比的性能。Python以其简单性和......
  • 【C++】构造函数类别
    1、默认构造函数形式:没有入参调用方式:直接定义声明:Constructor();调用:Constructorc;2、初始化构造函数形式:有参数列表调用方式:传参即可声明:Constructor(inta,intb);调用:Constructorc(1,2);3、拷贝构造函数形式:参数为变量常引用调用方式:当使用现有对象初......
  • C++标准模板库(STL)|容器|vector| queue|
    对STL进行总结,STL是standardtemplatelibrary的简写,是C++中的一个标准模板库,用于实现常用的数据结构和算法,它是C++程序员经常使用的一个工具箱。STL的主要目的是提高开发效率和代码质量,使得程序员可以更加便捷地完成常见的操作。里面包括:算法(algorithm)、容器(container)、仿函......
  • C++ Rect And Point Search Algorithm
    测试 ////Createdbywwwon2024/8/8.//#include"include/cxstructs.h"#include"include/cxml/k-NN.h"//可扩展Rect内搜索子Rect或PointvoidtestRectSearch(){usingnamespacecxstructs;std::random_devicerd;std::mt19937gen(rd()......
  • Linux C++ 开发2 - 编写、编译、执行第一个程序
    上一篇《LinuxC++开发1-搭建C++开发环境》我们搭建好了C++的开发环境,本篇我们将编写、编译、执行第一个程序。1.第一个C++程序1.1.demo01.cpp这里写一个最简单的HelloWord程序#include<iostream>intmain(){std::cout<<"Hello,world!"<<std::endl;re......
  • C++ 根据层序遍历数组 构造二叉树
    说明该层序遍历数组中空节点会使用-1代替,即该层序遍历数组可以理解为一个完全二叉树代码利用队列实现左右子节点的存储,每次通过获取队列头部元素即为当前头节点,然后在数组中i和i+1对应该头结点下的左右子节点,如果不为-1,那么说明可以入队。structTreeNode{intval;Tree......
  • 运算符续集
    1.扩展增值运算符**省略了一些加减删除的步骤而直接运算的运算符**2.面试题区分""+a+b和a+b+""3.条件运算符(必须掌握)如果符合条件x则输出y,否则输出z......
  • C++进制转换
    这篇代码是我早就打出来的,当时放在百度网盘,本地放在硬盘上,后来硬盘坏了,最近清网盘的时候才想起来,所以赶紧改了改就发出来了这也是我比较早的代码了,所以记得并不清楚,改也只改了一点,当时不爱打注释,具体思路也忘得一干二净,所以直接把代码贴出来了(好像屁话有点多)Code:#include......