=default和=delete之二

c++ primer 5th上在讲到=default和=delete时,都是说的函数声明,不便于理解。可以按下面理解,认为编译器在=default和=delete出现的地方自动换为函数定义。

 

=default:

1,只能对编译器可以合成的默认构造函数或拷贝控制成员使用=default。

2,在声明时加上关键字=default。但是在编译代码时,显式让编译器在default关键字出现的地方生成合成的函数定义

     因此不能再自己定义,否则会出现重复定义错误。

     (1) 若在类内声明时指定default,则是内联的; 若在外部声明时指定,则是非内联的。

     因此c++ primer 5th P237“=default 既可以和声明一起出现在类的内部,也可以作为定义出现在类的外部”在理解上需要注意,在外部类定义外部是编译器把=default关键字换为函数的定义。

1, 只在类定义时声明为default. 编译器会在此进行定义函数。此时是内联的.
class base {
public:
    base() = default;
private:
    int a;
};

2, 在类定义时声明非default,在类定义外声明为default,编译器会在此进行定义函数. 此时不是内联.
class base {
public:
    base(); //首次声明
private:
    int a;
};
// ok. 编译器会在此进行定义函数
base::base() = default;

3,在类定义时声明为default,编译器会在此进行定义函数,类定义外不能再定义,否则会重复定义错误
class base {
public:
    base() = default;
private:
    int a;
};
//下面三种情况都会编译报错:error: definition of explicitly-defaulted 'base::base()'
base::base() = default;
base::base() {};
base::base();

 

=delete

是这样一种函数:我们虽然声明的它们,但不能以任何方式使用它们。

1,可以对任何函数指定=delete。

2,必须出现在函数第一次声明的时候(在编译代码时,显式让编译器在delete关键字出现的地方生成合成的函数定义,因为通过调试,在类外在此定义时会报重复定义错误)。

3,通知编译器(以及我们代码的读者),我们不能定义这些函数(应理解为程序员不能定义,是编译器去定义)。

4,即使编译器定义了该函数,但仍不能以任何方式使用它们。

class base {
public:
    base(const base&) = delete;
private:
    int a;
};

// 下面两种情况都会报重复定义. error: redefinition of 'base::base(const base&)'
(1)
base::base(const base &rhs)
{
    a = rhs.a;
}
(2)
base::base(const base &rhs) = delete;
// note: 'base::base(const base&)' previously defined here
//     base(const base&) = delete;

// 普通函数一样,不能对声明为delete的函数进行定义
void aa() = delete;
// 报重复定义. error: redefinition of 'void aa()'
// note: 'void aa()' previously defined here
// void aa() = delete;
void aa()
{
    cout << "aa" << endl;
}
int main()
{
    cout << "hello" << endl;
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,delete和=default是两个关键字,其中delete用于显式地销毁对象,而=default用于显式地生成默认函数。 1. delete delete是C++中一个用于销毁对象的关键字,它可以用来销毁new出来的对象,释放内存空间。delete只能用于指向动态分配内存的指针,不能用于指向栈内存或静态内存的指针。delete的语法如下: ``` delete ptr; ``` 其中,ptr是指向动态分配内存的指针。使用delete释放内存后,应将指针赋值为nullptr,以避免悬空指针的出现。 2. =default =default是C++11中新增的一个关键字,它可以用于显式地生成默认函数。默认函数是指编译器自动生成的函数,如默认构造函数、复制构造函数、复制赋值运算符和析构函数等。在C++11之前,如果需要显式地声明默认函数,需要手动编写函数代码。而在C++11中,可以使用=default来显式地生成默认函数。例如: ``` class MyClass { public: MyClass() = default; //显式地生成默认构造函数 MyClass(const MyClass& other) = default; //显式地生成复制构造函数 MyClass& operator=(const MyClass& other) = default; //显式地生成复制赋值运算符 ~MyClass() = default; //显式地生成析构函数 }; ``` 需要注意的是,使用=default来生成默认函数时,需要保证该函数是可以编译通过的,否则会导致编译错误。如果一个类中的某个函数被显式地声明为=default,那么编译器会自动忽略该函数的实现,而使用默认实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值