拷贝构造函数在哪几种情况下调用
2个回答
展开全部
有时候需要自己定义拷贝构造函数,以避免浅拷贝问题。
在什么情况下需要用户自己定义拷贝构造函数:
一般情况下,当类中成员有指针变量、类中有动态内存分配时常常需要用户自己定义拷贝构造函数。
在什么情况下系统会调用拷贝构造函数:(三种情况)
(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;
在什么情况下需要用户自己定义拷贝构造函数:
一般情况下,当类中成员有指针变量、类中有动态内存分配时常常需要用户自己定义拷贝构造函数。
在什么情况下系统会调用拷贝构造函数:(三种情况)
(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;
展开全部
构造函数
科普中国 | 本词条由“科普中国”科学百科词条编写与应用工作项目审核
审阅专家 刘燕兵
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
中文名
构造函数
外文名
constructor
作用
为对象成员变量赋初始值
语句
new运算符一起使用
快速
导航
应用其他特点语法内存机制语言细节
主要特点
1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;
科普中国 | 本词条由“科普中国”科学百科词条编写与应用工作项目审核
审阅专家 刘燕兵
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
中文名
构造函数
外文名
constructor
作用
为对象成员变量赋初始值
语句
new运算符一起使用
快速
导航
应用其他特点语法内存机制语言细节
主要特点
1.构造函数的命名必须和类名完全相同。在java中普通函数可以和构造函数同名,但是必须带有返回值;
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的;
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询