1 C++的拷贝构造函数
1.1 拷贝构造函数的含义与形式
C++的拷贝构造函数与构造函数不同,其作用主要是实现从源类对象到目标类对象逐个字节的复制,即目标对象和源对象都等于源对象的值。
C++中类的拷贝构造函数(赋值构造函数)的常用的形式如下
类名(const 类名& exp)
比如我们写一个Example
类,那么它的构造函数、析构函数、拷贝构造函数如下所示
class Example
{
public:
Example()
{
std::cout << "构造函数" << std::endl;
}
virtual~Example()
{
std::cout << "析构函数" << std::endl;
}
Example(const Example& exp)
{
std::cout << "拷贝构造函数" << std::endl;
}
};
那么是什么时候会调用类的拷贝构造函数呢?
1.2 调用类的拷贝构造函数的几种情况
在以下几种情况下会调用类的拷贝构造函数:
- 当使用某类的一个对象初始化该类的另一个对象(引用)时会自动调用拷贝构造函数;
- 当一个函数的形参为一个类的对象时,会自动调用拷贝构造函数;
- 当一个函数的返回值为一个类的对象时,会自动调用拷贝构造函数;
1.2.1 当使用某类的一个对象初始化该类的另一个对象(引用)时
示例代码如下:
#include <iostream>
class Example
{
public:
Example()
{
std::cout << "构造函数" << std::endl;
}
virtual~Example()
{
std::cout << "析构函数" << std::endl;
}
Example(const Example& exp)
{
std::cout << "拷贝构造函数" << std::endl;
}
};
int main()
{
Example example_a;
Example example_b(example_a);
return 0;
}
输出
构造函数
拷贝构造函数
析构函数
析构函数
1.2.2 当一个函数的形参为一个类的对象时
示例代码如下
#include <iostream>
class Example
{
public:
Example()
{
std::cout << "构造函数" << std::endl;
}
virtual~Example()
{
std::cout << "析构函数" << std::endl;
}
Example(const Example& exp)
{
std::cout << "拷贝构造函数" << std::endl;
}
};
void func(Example a)
{
std::cout << "enter void func(Example a)" << std::endl;
}
int main()
{
Example example_a;
func(example_a);
return 0;
}
输出结果
构造函数
拷贝构造函数
enter void func(Example a)
析构函数
析构函数
1.2.3 当一个函数的返回值为一个类的对象时
示例代码如下
#include <iostream>
class Example
{
public:
Example()
{
std::cout << "构造函数" << std::endl;
}
virtual~Example()
{
std::cout << "析构函数" << std::endl;
}
Example(const Example& exp)
{
std::cout << "拷贝构造函数" << std::endl;
}
};
Example copy_return()
{
Example temp;
return temp;
}
int main()
{
Example example_a;
Example example_copy = copy_return();
return 0;
}
输出结果
构造函数
构造函数
拷贝构造函数
析构函数
析构函数
析构函数
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++ – 拷贝构造函数与拷贝构造函数调用时机
原文链接:https://www.stubbornhuang.com/2412/
发布于:2022年11月16日 11:11:37
修改于:2023年06月21日 17:52:16
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
52