当前位置:首页 > C++ > 正文内容

C++ 拷贝构造函数

admin4年前 (2021-03-25)C++2368

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。

通常用于:

  • 通过使用另一个同类型的对象来初始化新创建的对象。

  • 复制对象把它作为参数传递给函数。

  • 复制对象,并从函数返回这个对象。

如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。

以上来自:https://www.runoob.com/cplusplus/cpp-copy-constructor.html

定义一个类:

class TestClass
{
public:
	int GetNum();
	void SetNum(int a);

	//构造函数
	TestClass(int a);
	//拷贝构造函数
	TestClass(const TestClass& t);
	//析构函数
	~TestClass();

private:
	int* ptr;
};

int TestClass::GetNum()
{
	return *ptr;
}


void TestClass::SetNum(int a)
{
	*ptr = a;
}

TestClass::TestClass(int a)
{
	ptr = new int;
	*ptr = a;
	printf("创建对象");
}

TestClass::TestClass(const TestClass& t)
{
	ptr = new int;
	*ptr = *(t.ptr);
}

TestClass::~TestClass()
{
	delete ptr;
	printf("调用析构函数!
");
}

main函数:

int nain()
{
	TestClass t = TestClass(2);
	TestClass t2(t);
    return 0;
}

t2对象创建的时候调用的是自己定义的拷贝构造函数。

如果这里不手动创建拷贝构造函数而是让编译器自己创建的话会出问题,这里是因为类的私有成员变量是一个指针,使用自动的拷贝构造函数的话,实际上是以浅拷贝的方式对新对象初始化的,这样带来的问题就是这个成员指针只是简单的保存地址,并没有创建新的堆内存,待到用来初始化的对象销毁时在析构函数里释放掉了这部分内存,导致新对象销毁时对这块内存重复的进行了释放,从而带来问题。

上面的不明白可以将类定义中的拷贝构造函数删掉,测试一下就明白了。

 

 

 

扫描二维码推送至手机访问。

版权声明:本文由lovedm.club发布,如需转载请注明出处。

本文链接:http://lovedm.club/?id=124

分享给朋友:

“C++ 拷贝构造函数” 的相关文章

C++ 计算点到空间直线的距离

最近的工作中需要计算空间中点到直线的距离,网上找了个算法:链接很简单,就是余弦定理算出余弦,知道余弦算出正弦,然后求出高也就是距离。当然这里不考虑效率问题,实验性的代码,先能用再优化。struct Point {     double ...

C++ 函数指针

1、什么是函数指针函数是实现特定功能的程序代码的集合,函数代码在内存中也要占据一段存储空间,这段空间的起始地址称为函数的入口地址。C++规定函数的入口地址为函数的指针,即函数名既代表函数,又是函数的指针(或地址)。C++指向函数的指针变量,定义形式为:返回类型 (*函数指针变量名)(形参列表);可以...

C++ 派生类的析构函数的执行顺序

C++ 派生类的析构函数的执行顺序

C++中派生类是不会继承父类的构造函数和析构函数的,这一点要明确。派生类中构造函数的执行顺序是先父类的构造函数然后当前类,析构函数则相反。举例如下:#include <iostream> using namespace std; class&nb...

C++常量

关于常量的一些形式以及含义在此记录一下:#include <iostream> using namespace std; int main() { //常量,不能改变值 const int a =&n...

GDAL构建Delaunay三角网

GDAL能创建Delaunay三角网我是没想到的,需要包含头文件gdal_alg.h使用GDALTriangulationCreateDelaunay函数,函数说明在此 ,三个参数:第一个是点的个数,第二三个分别是点的X坐标和点的Y坐标。返回值是GDALTriangulation* 类型的...