=default:
1,只能对编译器可以合成的默认构造函数或拷贝控制成员使用=default。
2,是显式让编译器来生成合成的函数。不能自己定义。只能声明。
(1) 可以允许在类定义内外同时声明,不过需要default需要在类外声明时指定。
(2) 若在类内声明时指定default,则是内联的; 若在外部声明时指定,则是非内联的。
因此c++ primer 5th P237“=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,必须出现在函数第一次声明的时候。
3,通知编译器(以及我们代码的读者),我们不能定义这些函数。
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;
}