⑴ 拷贝构造函数在哪几种情况下调用
有时候需要自己定义拷贝构造函数,以避免浅拷贝问题。
在什么情况下需要用户自己定义拷贝构造函数:
一般情况下,当类中成员有指针变量、类中有动态内存分配时常常需要用户自己定义拷贝构造函数。
在什么情况下系统会调用拷贝构造函数:(三种情况)
(1)用类的一个对象去初始化另一个对象时
(2)当函数的形参是类的对象时(也就是值传递时),如果是引用传递则不会调用
(3)当函数的返回值是类的对象或引用时
#include <iostream>
using namespace std;
class A
{
private:
int a;
public:
A(int i){a=i;} //内联的构造函数
A(A &aa);
int geta(){return a;}
};
A::A(A &aa) //拷贝构造函数
{
a=aa.a;
cout<<"拷贝构造函数执行!"<<endl;
}
int get_a(A aa) //参数是对象,是值传递,会调用拷贝构造函数
{
return aa.geta();
}
int get_a_1(A &aa) //如果参数是引用类型,本身就是引用传递,所以不会调用拷贝构造函数
{
return aa.geta();
}
A get_A() //返回值是对象类型,会调用拷贝构造函数。会调用拷贝构造函数,因为函数体内生成的对象aa是临时的,离开这个函数就消失了。所有会调用拷贝构造函数复制一份。
{
A aa(1);
return aa;
}
A& get_A_1() //会调用拷贝构造函数,因为函数体内生成的对象aa是临时的,离开这个函数就消失了。所有会调用拷贝构造函数复制一份。
{
A aa(1);
return aa;
}
int _tmain(int argc, _TCHAR* argv[])
{
A a1(1);
A b1(a1); //用a1初始化b1,调用拷贝构造函数
A c1=a1; //用a1初始化c1,调用拷贝构造函数
int i=get_a(a1); //函数形参是类的对象,调用拷贝构造函数
int j=get_a_1(a1); //函数形参类型是引用,不调用拷贝构造函数
A d1=get_A(); //调用拷贝构造函数
A e1=get_A_1(); //调用拷贝构造函数
return 0;
⑵ java中有没有拷贝构造函数这个概念
Java中对象的直接赋值都是赋reference,比如:
MyObject a = b;
a和b就指向了同一块内存,所以,肯定没有什么 constructor了!
⑶ Java中拷贝构造方法
构造函数是创建对象时调用的函数,构造函数可以重载,复制构造函数是一种特殊构造函数,具体可以上网查
⑷ Java实现自定义数组的拷贝构造函数
好难哦!!!
⑸ java中拷贝构造方法怎么用的就是public(或private等) 类名(类名 名称)
public class T {
private String a;
private String b;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
//用构造函数复制,根据需要复制相应的属性。比如你不想复制属性a,则下面第一句话就不用。
public T(T source){
a = source.a;
b = source.b;
}
public T(){
}
//用方法复制。
public T clone(){
T t = new T();
t.a= a;
t.b = b;
return t;
}
public static void main(String[] args) {
T t1 = new T();
t1.setA("a");
T t2 = new T(t1);
T t3 = t1.clone();
System.out.println(t2.getA() );
System.out.println(t3.getA());
}
⑹ java中有拷贝构造函数的概念吗方法传递对象时一般如何避免副作用
我也是找的,希望帮到你。
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”)
1) 一个对象作为函数参数,以值传递的方式传入函数体
2) 一个对象作为函数返回值,以值传递的方式从函数返回
3) 一个对象用于给另外一个对象进行初始化(常称为复制初始化)
当用引用变量做参数时,不调用拷贝构造函数,用传递引用的方式给函数传递一个对象的引用时,只传递了该对象的地址,系统消耗较小。在函数体内访问 形参,实际是访问了这个作为实参的对象。例如:void function(CTest & test);
Java中的引用传递是指: 例如:void function(CTest test),没有&号
通常的原则是:①对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;②在提供拷贝构造函数的同时,还应该考虑重载"="赋值操作符号。
具体过程:首先建立对象theObjtwo,并调用其构造函数,然后成员被复制初始化。
其完成方式是内存拷贝,复制所有成员的值。完成后,theObjtwo.pBuffer==theObjone.pBuffer。
即它们将指向同样的地方,指针虽然复制了,但所指向的空间并没有复制,而是由两个对象共用了。这样不符合要求,对象之间不独立了,并为空间的删除带来隐患。所以需要采用必要的手段来避免此类情况:可以在构造函数中添加操作来解决指针成员的这种问题。
所以C++语法中除了提供缺省形式的构造函数外,还规范了另一种特殊的构造函数:拷贝构造函数,一种特殊的构造函数重载。上面的语句中,如果类中定义了拷贝构造函数,在对象复制初始化时,调用的将是拷贝构造函数,而不是缺省构造函数。在拷贝构造函数中,可以根据传入的变量,复制指针所指向的资源。
拷贝构造函数的格式为:类名(const 类名& 对象名);//拷贝构造函数的原型,参数是常量对象的引用。由于拷贝构造函数的目的是成员复制,不应修改原对象,所以建议使用const关键字。
下面介绍拷贝构造函数的另一种调用:当对象直接作为参数传给函数时,函数将建立对象的临时拷贝,这个拷贝过程也将调用拷贝构造函数。
总结:当某对象是按值传递时(无论是作为函数参数,还是作为函数返回值),编译器都会先建立一个此对象的临时拷贝,而在建立该临时拷贝时就会调用类的拷贝构造函数。
拷贝构造函数的实现:
类名::类名(类名&对象名)//拷贝构造函数的实现/定义
⑺ java中构造方法和拷贝构造方法是什么意思
构造函数只能进行浅,就是只能复制简单类型如int,float数据到另一副本。
如果对象中包含了对象等复杂类型,浅拷贝对象其实是对象的引用,而不是重新生成一个新副本。这时,如果对一个实例的内部类类型修改,其他实例的内部类类型也会被修改。这时就需要构造函数来进行深复制(也就是使对象中包含的类等复杂类型使用值赋值,而不是引用赋值)。
⑻ Java中,什么是复制构造函数
Java不支持像C++中那样的复制构造函数,这个不同点是因为如果不自己写构造函数的情况下,Java不会创建默认的复制构造函数。
⑼ java中有类似C++中的拷贝构造函数的方法吗
public
class
Test{
private
int
a,b,c;
public
Test(Test
tTest){
//1
通过反射原理把
tTest中[a,b,c]的值付给this.[a,b,c]
//手工写代码
如this.a
=
tTest.a,this.b=tTest.b
等等
}
}