C++提高:拷贝构造函数

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++提高:拷贝构造函数相关的知识,希望对你有一定的参考价值。

拷贝构造函数里能调用 private 成员变量吗?

解答:拷贝构造函数其时就是一个特殊的构造函数,操作的还是自己类的成员变量,所以不受 private 的限制

一个类中可以存在多于一个的拷贝构造函数吗?

解答:类中可以存在超过一个拷贝构造函数。
例子:

class X {
public:
	X(const X&); // const 的拷贝构造 
	X(X&); // 非 const 的拷贝构造 
};

调用拷贝构造函数的情形

1. 一个对象作为函数参数,以值传递的方式传入函数体

例如下面案例
在这里插入图片描述

#include<iostream>
using namespace std;
class A {
public:
	A() {};//构造函数
	A(A&a)//复制构造函数
	{
		cout << "Copy constructer called" << endl;
	}
};
void Func(A a)//普通函数
{

}
int main()
{
	A b;
	Func(b);//此语句相当于是将b复制给Func(a)中的a,导致调用复制构造函数
	return 0;

}

2. 一个对象作为函数返回值,以值传递的方式从函数返回

例如下面案例,Func函数得到的是返回值a
在这里插入图片描述

#include<iostream>
using namespace std;

class A {
public:
	int v=0;
	A(int i) {
		v = i;
	};//构造函数
	A(A&a)//复制构造函数
	{
		cout << "Copy constructer called" << endl;
	}
};
A a(4);
A Func()//普通函数
{
	return a;
}
int main()
{
	cout << Func().v << endl;//此语句中的Func()是一个类A的对象,但是不是a,只是用a初始化。
	return 0;

}

3. 一个对象用于给另外一个对象进行初始化(常称为赋值初始化)

例如这样就会调用

Complex c1(c2);
Complex c1=c2;

这样就不会调用(这是浅复制)

Complex c1,c2;
c1=c2;

以上是关于C++提高:拷贝构造函数的主要内容,如果未能解决你的问题,请参考以下文章

C++提高:拷贝构造函数

C++提高:拷贝构造函数

移动构造函数

关于C++默认拷贝构造函数

拷贝构造函数(c++常问问题一)

c++ 编译器会绕过拷贝构造函数