导读
在C++中我们创建一个类,编译器会我们默认生成某些函数,而且这些函数都是public和inline类型的函数,下面我们看看c++在什么情况编译器会默认生成那些函数
c++中创建一个类默认生成的函数
- default构造函数(无参构造函数)
- 拷贝构造函数
- =重载操作符函数
- 析构函数
- 移动构造函数
上面的这些函数是我们再定义一个空类时,编译器为我们默认生成的函数,默认构造函数和析构函数是一定会生成的,剩下的三个函数只有我们在代码中使用的时候才会生成。
- 代码:
class tc1
{
public:
int m_a;
};
void test13()
{
int a = 10,b =0;
tc1 a1;
a1.m_a = a;
tc1 a2 = a1; //拷贝构造函数
tc1 a3(b);
a3 = a1; //=操作符重载
tc1 a4(std::move(a2)); //移动构造函数
std::cout << a1.m_a << std::endl;
std::cout << a2.m_a << std::endl;
std::cout << a3.m_a << std::endl;
std::cout << a4.m_a << std::endl;
}
输出结果:
10
10
10
10
请按任意键继续. . .
什么情况下回隐藏默认生成的函数
当我们自己给类显示的创建构造函数时,编译器为一个类生成的函数有:
- 拷贝构造函数
- 析构函数
- 移动构造函数
- =重载操作符
代码:
class tc1
{
public:
tc1(int& a) :m_a(a) {};
public:
int m_a;
};
void test13()
{
int a = 10,b =0;
//tc1 a1; 这行是不能编译通过的,因为这时系统不会创建默认构造函数了
tc1 a1(a);
tc1 a2 = a1;
tc1 a3(b);
a3 = a1;
tc1 a4(std::move(a2));
//a3 = a1;
std::cout << a1.m_a << std::endl;
std::cout << a2.m_a << std::endl;
std::cout << a3.m_a << std::endl;
std::cout << a4.m_a << std::endl;
}
输出:
10
10
10
10
请按任意键继续. . .
上述代码中,我们给类一个有一个参数的构造函数,系统仍然会我们生成这些函数
当有const和引用参数时,编译器创建的函数
- 拷贝构造函数
- 析构函数
- 移动构造函数
代码:
class tc1
{
public:
tc1(int& a) :m_a(a) {};
public:
int& m_a;
};
void test13()
{
int a = 10,b =0;
tc1 a1(a);
tc1 a2 = a1;
tc1 a3(b);
//a3 = a1; 不能通过编译,
tc1 a4(std::move(a2));
std::cout << a1.m_a << std::endl;
std::cout << a2.m_a << std::endl;
std::cout << a3.m_a << std::endl;
std::cout << a4.m_a << std::endl;
}
输出:
10
10
0
10
请按任意键继续. . .
其实这个也很好解释,因为当成员中出现const 和 &变量,首先const变量是不可以被修改的,&变量虽然可以被修改但是如果调用=重载符相当于改变引用的对象,还是违反了c++的语法。
如果感觉有用请麻烦点个赞。
声明:本博客为博主原创,如若转载请注明出处。