本文目录一览:
- 1、JAVA中有没有缺省的拷贝构造函数
- 2、拷贝构造函数在哪几种情况下调用
- 3、java中有拷贝构造函数的概念吗?方法传递对象时一般如何避免副作用?
- 4、拷贝构造函数的作用
- 5、java中构造方法和拷贝构造方法是什么意思
JAVA中有没有缺省的拷贝构造函数
java中有缺省的拷贝构造函数,具体参考下面的代码:
//Example:
//1.Clock类:
public class Clock {
private int hour;
private int minute;
private int second;
public Clock(){
setTime(0,0,0);
}
public Clock(int h,int m,int s){
setTime(h,m,s);
}
/* 拷贝构造函数 */
public Clock(Clock clock){
this.hour=clock.hour;
this.minute=clock.minute;
this.second=clock.second;
}
public int getHour() {
return hour;
}
public int getMinute() {
return minute;
}
public int getSecond() {
return second;
}
public void setTime(int h,int m,int s){
if(h=0 h24)
this.hour=h;
else
this.hour=0;
if(m=0 m60)
this.minute=m;
else
this.minute=0;
if(s=0 s60)
this.second=s;
else
this.second=0;
}
public void printTime(){
if(this.hour10)
System.out.print("0");
System.out.print(this.hour+":");
if(this.minute10)
System.out.print("0");
System.out.print(this.minute+":");
if(this.second10)
System.out.print("0");
System.out.println(this.second);
}
}
//2.main函数:
public class Program {
public static void main(String[] args) {
Clock c1=new Clock(6,43,23);
Clock c2=new Clock(c1);//调用拷贝构造函数
c1.printTime();
c2.printTime();
}
}
//3.运行结果:
06:43:23
06:43:23
拷贝构造函数在哪几种情况下调用
有时候需要自己定义拷贝构造函数,以避免浅拷贝问题。
在什么情况下需要用户自己定义拷贝构造函数:
一般情况下,当类中成员有指针变量、类中有动态内存分配时常常需要用户自己定义拷贝构造函数。
在什么情况下系统会调用拷贝构造函数:(三种情况)
(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中有拷贝构造函数的概念吗?方法传递对象时一般如何避免副作用?
我也是找的,希望帮到你。
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”)
1) 一个对象作为函数参数,以值传递的方式传入函数体
2) 一个对象作为函数返回值,以值传递的方式从函数返回
3) 一个对象用于给另外一个对象进行初始化(常称为复制初始化)
当用引用变量做参数时,不调用拷贝构造函数,用传递引用的方式给函数传递一个对象的引用时,只传递了该对象的地址,系统消耗较小。在函数体内访问 形参,实际是访问了这个作为实参的对象。例如:void function(CTest test);
Java中的引用传递是指: 例如:void function(CTest test),没有号
通常的原则是:①对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;②在提供拷贝构造函数的同时,还应该考虑重载"="赋值操作符号。
具体过程:首先建立对象theObjtwo,并调用其构造函数,然后成员被复制初始化。
其完成方式是内存拷贝,复制所有成员的值。完成后,theObjtwo.pBuffer==theObjone.pBuffer。
即它们将指向同样的地方,指针虽然复制了,但所指向的空间并没有复制,而是由两个对象共用了。这样不符合要求,对象之间不独立了,并为空间的删除带来隐患。所以需要采用必要的手段来避免此类情况:可以在构造函数中添加操作来解决指针成员的这种问题。
所以C++语法中除了提供缺省形式的构造函数外,还规范了另一种特殊的构造函数:拷贝构造函数,一种特殊的构造函数重载。上面的语句中,如果类中定义了拷贝构造函数,在对象复制初始化时,调用的将是拷贝构造函数,而不是缺省构造函数。在拷贝构造函数中,可以根据传入的变量,复制指针所指向的资源。
拷贝构造函数的格式为:类名(const 类名 对象名);//拷贝构造函数的原型,参数是常量对象的引用。由于拷贝构造函数的目的是成员复制,不应修改原对象,所以建议使用const关键字。
下面介绍拷贝构造函数的另一种调用:当对象直接作为参数传给函数时,函数将建立对象的临时拷贝,这个拷贝过程也将调用拷贝构造函数。
总结:当某对象是按值传递时(无论是作为函数参数,还是作为函数返回值),编译器都会先建立一个此对象的临时拷贝,而在建立该临时拷贝时就会调用类的拷贝构造函数。
拷贝构造函数的实现:
类名::类名(类名对象名)//拷贝构造函数的实现/定义
拷贝构造函数的作用
用一个已有的对象来初始化一个被创建的同类的对象,是一种特殊的构造函数,具有一般构造函数的所有特性,其形参是本类对象的引用。
用户可以根据自己实际问题的需要定义特定的拷贝构造函数,以实现同类对象之间数据成员的传递。如果用户没有声明类的拷贝构造函数,系统就会自动生成一个缺省拷贝构造函数,这个缺省拷贝构造函数的功能是把初始对象的每个数据成员的值都复制到新建立的对象中。
扩展资料
拷贝构造函数使用原则:对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;在提供拷贝构造函数的同时,还应该考虑重载“=”赋值操作符号。
传递形式:拷贝构造函数必须以引用的形式传递(参数为引用值)。其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的被调用来生成函数中的对象。
如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。
参考资料来源:百度百科-拷贝构造函数
参考资料来源:百度百科-深拷贝
java中构造方法和拷贝构造方法是什么意思
构造函数只能进行浅copy,就是只能复制简单类型如int,float数据到另一副本。
如果对象中包含了对象等复杂类型,浅拷贝对象其实是对象的引用,而不是重新生成一个新副本。这时,如果对一个实例的内部类类型修改,其他实例的内部类类型也会被修改。这时就需要copy构造函数来进行深复制(也就是使对象中包含的类等复杂类型使用值赋值,而不是引用赋值)。