java什么情况下要定义java的复制构造函数数

拷贝构造函数和赋值函数的一些知识
1.拷贝构造函数生成新的类对象,而赋值运算符不能。
2.由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新对象相同,而复制操作符需要这个操作,另外赋值运算符中如果原来对象中有内存分配,要先把内存释放掉。
下面是String类的一个实现的部分函数,可以看出二者的区别。
&1 class String{
&2 public:
&3 & & String(const char * str = NULL);
&4 & & String(const String& other);
&5 & & ~String();
&6 & & String& operator=(const String& other);
&7 private:
&8 & & char *m_
11 String::String(const char * str){
12 & & if (str != NULL){
13 & & & & int length = strlen(str);
14 & & & & m_data = new char[length + 1];
15 & & & & strcpy(m_data, str);
19 String::~String(){
20 & & delete m_
23 String::String(const String& other){
24 & & int length = strlen(other.m_data);
25 & & m_data = new char[length + 1];
26 & & assert(m_data != NULL);
27 & & strcpy(m_data, other.m_data);
30 String& String::operator=(const String& other){
31 & & if (this == &other){ & & & & & & & & //这里要判断是否自我赋值
32 & & & & return *
34 & & if (m_data != NULL){ & & & & & & & & //要检验是否有内存分配
35 & & & & delete m_
37 & & int length = strlen(other.m_data);
38 & & m_data = new char[length + 1];
39 & & assert(m_data == NULL);
40 & & strcpy(m_data, other.m_data);
41 & & return *
/**************一种调用拷贝构造函数和赋值函数的微妙差别*******************/
#include&iostream&
#include&assert.h&
& & B():data(0){
& & & & cout && &default constructor& &&
& & B(int i):data(i){
& & & & cout && &constructed by parameter & && data &&
& & B (B &b){
& & & & data = b.
& & & & cout && &copyed by parameter & && data &&
& & B & operator=(const B& b){
& & & & this-&data = b.
& & & & cout && &= & & by parameter & && data &&
& & & & return *
void test(){
& & B b2 = b1;
& & b3 = b1;
int main(){
  test();
& & system(&pause&);
& & return 0;
test()函数和system(&pause&)是为了不退出main函数,可以看到析构函数执行。运行之后得到以下结果。
default constructor
copyed by parameter 0
default constructor
= & & by parameter 0
注意仔细看test函数里的代码段。
b2调用的是拷贝构造函数,而b3调用的是赋值函数。这两者是不同的。
/*********************关于拷贝构造函数和赋值函数的临时对象问题******************************/
看以下代码,它的输出会是什么。
&1 #include&iostream&
&2 #include&assert.h&
&5 class B{
&6 public:
&7 & & B():data(0){
&8 & & & & cout && &default constructor& &&
10 & & ~B(){
11 & & & & cout && &destructed by parameter & && data &&
13 & & B(int i):data(i){
14 & & & & cout && &constructed by parameter & && data &&
16 & & B (B &b){
17 & & & & data = b.
18 & & & & cout && &copyed by parameter & && data &&
20 & & B & operator=(const B& b){
21 & & & & this-&data = b.
22 & & & & cout && &= & & by parameter & && data &&
23 & & & & return *
25 private:
29 B play(B b){
33 void test(){
34 & & play(1);
35 & & B t1 = play(2);
36 & & B t2;
37 & & t2 = play(3);
40 int main(){
42 & & test();
43 & & system(&pause&);
44 & & return 0;
这个程序比上一个增加了一个play()函数和析构函数的输出。看到输出结果后,有一些疑惑。以下为输出结果,为方便起见,给它们编号。
(1)constructed by parameter 1 & & & & & & & & & & & & & & & & & & & & & &&
(2)copyed by parameter 1
(3)destructed by parameter 1
(4)destructed by parameter 1
(5)constructed by parameter 2
(6)copyed by parameter 2
(7)destructed by parameter 2
(8)default constructor
(9)constructed by parameter 3
(10)copyed by parameter 3
(11)destructed by parameter 3
(12)= & & by parameter 3
(13)destructed by parameter 3
(14)destructed by parameter 3
(15)destructed by parameter 2
如果有疑问,可以先了解下面三点。
1.用同一个类的源对象构造一个目标对象是,会调用拷贝构造函数来构造目标对象,如果没有定义拷贝构造函数,将会调用默认的拷贝函数来构造目标对象。
2.当类有一个带有一个参数的构造函数时,可以用这个参数同类型的数据初始化这个对象,默认会调用这个构造函数。
3.当一个函数的返回值为一个类的对象时,如果在调用函数中(注意是调用函数,不是被调用函数),没有定义一个对象来接收这个返回值,会用返回一个临时对象保存返回对象的值。在被调用函数(注意是被调用函数)结束时,这个临时对象被销毁。而当有一个接收对象时,就将返回对象赋值给接收对象,这个返回对象在调用函数(注意是调用函数)结束时调用析构函数。
第一点体现在程序35行,上面讲过,这是会调用拷贝构造函数而不是赋值函数。
第二点体现在34行,play(1)的类型是整型,而类B中有一个带int类型的构造函数,当实参1传给形参b,会调用这个构造函数。
第三点体现在34行和37行。play(1)函数被调用,返回一个类对象,而此时没有对象接收(在左边接受赋值),所以会返回一个临时对象,而这个临时对象在被调用函数play结束时调用析构函数销毁,输出(4)destructed by parameter 1;t2 = play(3);语句中play(3)被调用,返回一个对象,而此时有对象(t2)接收,所以调用赋值函数赋值给t2,在调用函数(test)结束时,这个对象才被销毁输出(13)destructed by parameter 3。java什么时候或什么情况下用构造方法
java什么时候或什么情况下用构造方法,谢谢指导。
08-11-07 &
如果有构造函数了。那么所有的成员变量初使化都要用到构造函数。如果没有构造函数,那么就能单独进行成员变量初使化。 如果有大量的成员变量需要初使化,有构造函数就可以简化许多工作量的,而且,构造函数是可以重载的。
请登录后再发表评论!
找了一个资料,参考一下把~~
请登录后再发表评论!
当你想通过传参数而创建对象的时候比如 public Test(int i){ System.out.println(i); } public static void main(String[] args){ Test t1=new Test(2); }
请登录后再发表评论!
这是初学者必须弄清楚的问题。 。你一定要老师问清楚,最好有工作经验的人解释给你
请登录后再发表评论!
这个是根据你的业务需求的,来定制你的构造函数的。
请登录后再发表评论!
在新建实体的时候需要用到
请登录后再发表评论!java 构造函数什么时候要自己定义_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
java 构造函数什么时候要自己定义
我有更好的答案
在运行函数前需要初始化某些数据的时候,不过一般的习惯就是 不管用不用先写个空的放那里
但我见的好多类中都没有构造函数,照样没报错。我知道有系统默认的无参数构造函数。我的意思是在什么情况下,必须自己定义构造函数?
是的 我只是说习惯上!!!不定义是不会报错的!!!这个你要我怎么说?如果宽泛的来说 没有必须 这一说 想用就用 不想用完全可以使用其他函数和调用来完成一些功能建议去看下书 上面讲的比较详细 然后都试试 其实可以不用的 不过工作上规范 这样写是不行的
采纳率:29%
来自团队:
个人觉得基本都要创建的吧~java bean的规范啊,比如说,类里面有无参构造器什么的望采纳
如果你需要在函数执行前,初始化某些数据,就需要自己定义
需要初始化数据的时候,先执行构造函数。
你需要的话就自己定义,不然就用默认的
一般来说,当一个对象被创建出来的时候,就必须要拥有一些属性,或者是执行一些操作的时候,就需要自定义构造方法去实现这些必要的操作。
其他3条回答
为您推荐:
其他类似问题
构造函数的相关知识
等待您来回答}

我要回帖

更多关于 java构造函数定义语法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信