C++中怎么拷贝构造函数(格式及相关符号的意识分别是什么)并且拷贝函数的作用是什么

C++中怎么拷贝构造函数(格式及相关符号的意识分别是什么)并且拷贝函数的作用是什么,第1张

拷贝构造函数的格式:

假设一个类的声明如下:

class TestCL

{

private:

int para;

public:

TestCL(){para = 0;}

TestCL(int paraIn){para = paraIn;}

TestCL(const TestCl& inputCL){[para = inputCLpara;}

~TestCL(){}

};

上面的声明中,TestCL(const TestCl& inputCL){para = inputCLpara;} 就是拷贝构造函数,格式一般如下: ClassName(const ClassName& in){}

2相关符号的意思:

首先需要明白,拷贝构造函数是构造函数的一类,因此该函数的名字与类名是相同的(这一点与普通的构造函数相同,也就是上面例子中的“TestCL”);其次,拷贝构造函数的参数一般只有一个,就是这个类的一个对象的引用(上面例子中的“const TestCl& inputCL”);第三,拷贝构造函数的内容,就是把入参(这个类的一个对象的引用)的成员变量的值赋给当前需要构造的对象的成员变量(上面例子中的“para = inputCLpara”)——在这里需要注意深拷贝和浅拷贝的问题(上面的例子中的是浅拷贝)

3拷贝函数的作用

就是通过已有的这个类的某个对象,来初始化,或者赋值给当前的这个对象;

拷贝构造函数,又称复制构造函数,由编译器调用来完成一些基于同一类的其他对象的构建及初始化。在一个对象以值传递的方式传入函数体时;一个对象以值传递的方式从函数返回时;一个对象用于给另外一个对象进行初始化(常称为赋值初始化)时被自动调用。

拷贝构造函数必须以引用的形式传递(参数为引用值)。当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。

如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。

扩展资料:

使用原则:

通常的原则是:对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;在提供拷贝构造函数的同时,还应该考虑重载"="赋值 *** 作符号。

拷贝构造函数的格式为:

类名(const 类名& 对象名); 拷贝构造函数的原型,参数是常量对象的引用。由于拷贝构造函数的目的是成员复制,不应修改原对象,所以建议使用const关键字。

-拷贝构造函数

复制构造函数的功能是用一个已知对象来初始化另一个同类的对象。复制构造函数其实也是类的构造函数,只不过被调用的时候,会自动将一个已知对象的数据成员的值拷贝给另一个同类对象。复制构造函数的特点如下:

复制构造函数名称与类名相同;

复制构造函数必须有且只有一个参数,是该类对象的引用;

每个类必须有一个复制构造函数。如果定义类的时候自己没有写,编译器编译时会自动生成一个复制构造函数;

复制构造函数格式:<类名>::<类名>(<类名> const&<引用名>)

被调用情况,例如:

假设classX是一个类,x和y是它的对象

classX x;//定义一个对象x

classX y(x);//定义对象y,把x作为参数,这时就会调用拷贝构造函数。

作用域是指变量在代码的哪个范围内是起作用的,即有效的。一般有全局作用域,和局部作用域。

可见域应该是指类数据成员的可见范围,一般有private,protected,和public。

拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其唯一的参数(对象的引用)是不可变的(const类型)。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。如果可以的话,它将用常量方式调用,另外,也可以用非常量方式调用。

在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):

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

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

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

如果在前两种情况不使用拷贝构造函数的时候,就会导致一个指针指向已经被删除的内存空间。对于第三种情况来说,初始化和赋值的不同含义是拷贝构造函数调用的原因。事实上,拷贝构造函数是由普通构造函数和赋值 *** 作符共同实现的。描述拷贝构造函数和赋值运算符的异同的参考资料有很多。

通常的原则是:①对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;②在提供拷贝构造函数的同时,还应该考虑重载=赋值 *** 作符号。原因详见后文。

拷贝构造函数必须以引用的形式传递(参数为引用值)。其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。 如果在类中没有显式的声明一个拷贝构造函数,那么,编译器会自动生成一个来进行对象之间非static成员的位拷贝(Bitwise Copy)。这个隐含的拷贝构造函数简单的关联了所有的类成员。注意到这个隐式的拷贝构造函数和显式声明的拷贝构造函数的不同在于对成员的关联方式。显式声明的拷贝构造函数关联的只是被实例化的类成员的缺省构造函数,除非另外一个构造函数在类初始化或构造列表的时候被调用。

拷贝构造函数使程序更有效率,因为它不用再构造一个对象的时候改变构造函数的参数列表。设计拷贝构造函数是一个良好的风格,即使是编译系统会自动为你生成默认拷贝构造函数。事实上,默认拷贝构造函数可以应付许多情况。

引申:在这里,与C#是不同的。C#里面用已知的对象去初始化另一个对象,传递的是该已知对象的指针,而并不是隐式地拷贝构造函数。例如: using System;using SystemCollectionsGeneric;using SystemLinq;using SystemText;namespace C_Sharp_structVSclass{class MyClass{public intval;}struct myStruct{public intval;}class Program{static void Main(string []args){MyClass objectA = new MyClass();MyClass objectB = objectA;objectAval=10;objectBval=20;ConsoleWriteLine({0},objectAval);ConsoleWriteLine({0},objectBval);ConsoleReadKey();}}}这里的输出会是“20,20”而不是C++里面的10,20。所以一定要跟C++区分开看。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/13494164.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存