首页 > 其他分享 >默认函数控制

默认函数控制

时间:2023-12-08 16:24:04浏览次数:34  
标签:控制 obj 函数 default 默认 Base 构造函数

文章参考:

爱编程的大丙 (subingwen.cn)

1. 类与默认函数

在C++中声明自定义的类,编译器会默认帮程序员生成一些未定义的成员函数,这些函数被称为默认函数,一共有六个:

  • 无参构造函数:创建类对象
  • 拷贝构造函数:拷贝类对象
  • 移动构造函数:拷贝类对象。
  • 拷贝赋值函数:类对象赋值。
  • 移动赋值函数:类对象赋值。
  • 析构函数:销毁类对象。

而一旦程序员自定义了这些函数,则编译器不会为该类函数生成默认版本。这会为我们带来一些问题,其中一个就是:

  • 一旦声明了自定义版本的构造函数,则就导致我们的类/结构体不再是平凡(trivial)的,也就不是POD类型。

这会让我们失去POD的一些优势。为了解决这一问题,C++11为我们提供了方法,那就是使用=default关键字。

2. default

C++11中可以使用=default来修饰函数,这样的函数被称为显式默认函数。可以在类内部修饰,也可以在类外部修饰。

2.1 在类内部指定函数为默认函数

一般情况下,我们在定义类的时候直接在类内部指定默认函数:

class Base
{
public:
    Base() = default;
    // Base(int i) = default;		error:default只能作用于六个默认形式的函数
    Base(const Base& obj) = default;
    Base(Base&& obj) = default;
    Base& operator= (const Base& obj) = default;
    Base& operator= (Base&& obj) = default;
    ~Base() = default;
};

其中:

  • 第4行:指定无参构造函数为默认函数。
  • 第6行:指定拷贝构造函数为默认函数。
  • 第7行:指定移动构造函数为默认函数。
  • 第8行:指定拷贝赋值操作符重载函数为默认函数。
  • 第9行:指定移动赋值操作符重载函数为默认函数。
  • 第10行:指定析构函数为默认函数。

2.2 在类外部指定函数为默认函数

// 类定义
class Base
{
public:
    Base();
    Base(const Base& obj);
    Base(Base&& obj);
    Base& operator= (const Base& obj);
    Base& operator= (Base&& obj);
    ~Base();
};
// 在类定义之外指定成员函数为默认函数
Base::Base() = default;
Base::Base(const Base& obj) = default;
Base::Base(Base&& obj) = default;
Base& Base::operator= (const Base& obj) = default;
Base& Base::operator= (Base&& obj) = default;
Base::~Base() = default;

2.3 应用范围

只能用来修饰用户声明的、和上述六个默认函数形式一致(指的是返回值类型、函数名、参数列表完全一致)的函数。 其他的都不行

class Base
{
public:
    Base() = default;
    // Base(int i=0) = default;					error
    // Base(int i, doublue j) = default;		error
    Base(const Base& obj) = default;
    Base(Base&& obj) = default;
    Base& operator= (const Base& obj) = default;
    Base& operator= (Base&& obj) = default;
    // bool operator== (const Base& obj) = default;		error
    ~Base() = default;
};

3. delete

有时我们可能想要显式的禁止一些成员函数的实现,例如禁止用户使用默认生成函数。这样可以有效的防止某些类型之间自动进行隐式类型转换而产生错误。

3.1 禁止使用默认生成的函数

class Base
{
public:
    Base() = default;
    Base(const Base& obj) = delete;
    Base& operator= (Base& obj) = delete;
};

int main()
{
    Base b;
    Base b1(b);    	// error
    Base b2 = b;    // error
    Base b3;
    b3 = b;			// error
    return 0;
}
  • 第5行:仅用了拷贝构造函数。
  • 第11、12行:由于拷贝构造函数被显式删除,无法拷贝对象。
  • 第15行:由于移动赋值操作符重载函数已经被显式删除,无法对象。

3.2 禁止使用自定义函数

class Base{
private:
    int _num;
public:
    Base(int num): _num(num){}
    Base(char c) = delete;
};

int main(void){
    Base b1(1);
    // Base b2('a');		error
    return 0;
}
  • 第6行:禁用带char类型参数的构造器。
  • 第11行:因此带char类型参数的构造器被显式禁用了,因此这一句是错误的。

标签:控制,obj,函数,default,默认,Base,构造函数
From: https://www.cnblogs.com/beasts777/p/17888367.html

相关文章

  • 13、QT窗口API函数基础知识
    QT窗口API函数geometry()用于获取窗口在屏幕上的几何位置和大小QRectgeo=widget->geometry();intx=geo.x();//窗口左上角的x坐标inty=geo.y();//窗口左上角的y坐标intw=geo.width();//窗口的宽度inth=geo.height();//窗口的高度width()函数返......
  • 农村高中生源转型期提升学生二次函数建模能力的课堂探究
        通过结合具体的数学问题,引导高中生深入分析问题,有效地构建求解问题的数学模型,可以使学生逐步掌握数学问题求解的基本思路以及模型建构的方法与注意事项。但是离开了反复训练,无法从根本上提升高中生的数学建模能力。因此,在平时的高中数学教学中,教师要注意结合数学教学的......
  • Modbus转Profinet网关同时控制6台232 Modbus伺服
    Modbus转Profinet网关同时控制6台232Modbus伺服利用Modbus转Profinet网关(XD-MDPN100/XD-PNR200),我们可以实现对6台232Modbus伺服的控制。通过连接这些伺服设备到Modbus转Profinet网关,我们可以方便地将它们接入Profinet网络,并实现对它们的远程控制和监测。这就为我们提供了一个便......
  • js 默认展示两行多余隐藏滑动及添加滑动条
    <divclass="nav-box"@scroll="scroll"><divfor="list"class="nav"><divclass="item-box">item</div></div></div><divclass="scroll-box"v-show=&q......
  • 流程控制
    流程控制分类: 一、顺序结构二、分支结构1、if结构1 2、if结构2 3、if结构3 4、switch语句格式 三、循环结构 1、for循环结构语句另:for循环的死循环: 2、while循环语句格式另while的死循环: 3、do...while循环语句  另:do..while死循环: ......
  • 公历日期转农历日期的SQL函数
       /*-------------------------------------------------------------------------------功能:返回指定日期的农历日期(需配合sys_date_lunar表使用)参数说明:@solarDay日期@type日期:0:年月日文本:1:月日的文本......
  • 在Python中,​​type()​​函数有两种用法
    在Python中,type()函数有两种用法¹²³⁴⁵:查看数据类型:当type()函数只有一个参数时,它会返回该参数的数据类型¹²³⁴⁵。例如:x=123print(type(x))#输出:<class'int'>在这个例子中,type(x)返回了x的数据类型,即<class'int'>,表示x是一个整数¹²³⁴⁵。动态创建类:当type()函......
  • 临时文件夹控制器
    应用中,有时候需要创建一个临时文件夹进行操作,操作完以后需要删除临时文件夹。创建一个控制类,自动创建和删除临时夹。控制类代码:publicclassTempDirectoryController:IDisposable{ privatestring_tempDir; privatereadonlystring_rootPath; ///<summary> ///临......
  • C++(默认参数、占位参数)
    在C++中,函数默认参数和占位参数都是用于提供函数参数的一些默认值或占位符,从而增加函数的灵活性。默认参数(DefaultParameters):在C++中,可以为函数的一个或多个参数提供默认值。这意味着调用函数时,如果没有提供相应的实参,将使用默认值。默认参数必须从函数声明开始定义,然后只......
  • 求所有的函数 f: R → R,使得对任意 x, y ∈ R 都有 (x + y)·[f(x) - f(y)] = (x - y)
    求所有的函数f:R→R,使得对任意x,y∈R都有(x+y)·[f(x)-f(y)]=(x-y)·f(x+y).解:由题设等式变形,即有 (x+y)·[f(x)-f(y)]/ (x-y)= f(x+y).再令y趋于x,就得到①    2x·f'(x)=f(2x).由①可知,f(x)在R\{0}上可导.f(x)在x=......