注册 登录
编程论坛 C++教室

关于构造函数和拷贝构造函数

辛夷 发布于 2008-10-05 22:29, 1529 次点击
正在学习C++,总感觉构造函数和拷贝构造函数很复杂,弄的不是很懂,哪位大虾能根据自己的经验说的详细一点啊!!!
13 回复
#2
blueboy820062008-10-05 22:36
多写些例子,多调试运行...
#3
zzt_4282008-10-07 19:37
一句两句说不清楚呵呵...构造函数用来构造新对象,,析构函数在对象死亡时调用,完成善后工作。
#4
四川大学2008-10-07 20:44
构造函数就是为了初始化。
复制构造函数要注意的是引用
#5
lscmxl2008-10-08 13:45
每个类都必须有构造函数(同时也有析构函数相对应),而拷贝构造函数不一定有。
构造函数与类同名!但里面没有参数。而拷贝构造函数也与类同名,但里面有参数。
同时构造函数顾名思义,就是程序运行时自动调用(构造),而拷贝构造函数则不然。所以代码不要写在构造函数中。
#6
blueboy820062008-10-08 13:57
[bo][un]四川大学[/un] 在 2008-10-7 20:44 的发言:[/bo]


复制构造函数要注意的是引用


不仅仅是这些...
#7
很远的那颗星2008-10-08 14:58
[bo][un]lscmxl[/un] 在 2008-10-8 13:45 的发言:[/bo]

每个类都必须有构造函数(同时也有析构函数相对应),而拷贝构造函数不一定有。
构造函数与类同名!但里面没有参数。而拷贝构造函数也与类同名,但里面有参数。
同时构造函数顾名思义,就是程序运行时自动调用(构 ...


谁说构造函数没有参数?

这个问题随便BAIDU一下都一大堆,楼主不妨试一下...
#8
sunkaidong2008-10-08 15:06
呵呵,放点代码吧。。。比说实在啊。。
#9
很远的那颗星2008-10-08 15:33
代码随便写的.呵呵..
#include<iostream>
using namespace std;
class A
{
      int a,b;
public:
       A(){};   //default constructor
       A(int aa,int bb):a(aa),b(bb){} //constructor
       A(A& aa)     //copy constructor
       {
            a = aa.a,b = aa.b;
       }   
       void display(){cout<<"a="<<a<<",b="<<b<<endl;}
};
int main(void)
{
    A Obj1;  //invoke A()
    A Obj2(2,3);  //invoke A(int,int)
    A Obj3(Obj2);  //invoke A(A&)
    Obj1.display(),Obj2.display(),Obj3.display();
    system("pause");
    return 0;
}
#10
网易2008-10-08 15:34
这个人很强大
#11
冰烨2008-10-09 09:10
所谓构造函数,顾名思义,就是构造一个对象(当然这要根据构造函数的具体内容包括参数来构造),在上面的代码中,A Obj1;  //没有明确指明构造函数,便调用默认构造
//han数,一种情况是无参的构造函数,另种情况便是参数都有缺省值的构造函数下面的也类似,参数匹配问题
    A Obj2(2,3);  //invoke A(int,int),

而拷贝构造函数,是为了根据一个已经存在的对象来构造另一个对象,而赋值号=也有类似的功能。但被调用的情况不一样。通常情况下,在我们不明写拷贝构造函数和不重载=时候,使用时候都会调用默认的。但是,这种情况下,无论是拷贝构造还是=都是按成员赋值。这样,若成员变量中有指针,拷贝构造后两个对象便会操作同块内存,往往出错。所以我们通常会重写拷贝构造函数和重载=.为指针变量开辟新的空间。
例如
class A
{
public:
 char* p;
}

如果我们不重写拷贝构造函数,这样用
A a;
A b(a);//这里会调用默认的拷贝构造函数,按成员赋值,会有b.p = a.p;这样a和b会共用p指向的地址。
所以我们重写拷贝构造
A(A&ra)
{
  p = new char;//在析构函数中delete
  strcpy(ra.p,p);
}
=和拷贝构造的结果应该是一样的,可被调用的情况不同
如 A A1;//调用默认构造,上面说过
   A A2(A1);//调用拷贝构造
   A A3 = A1;//调用重载的=
   A A4;//调用默认构造
   A4(A1);//注意,这里会调用=而不是拷贝构造函数。
#12
newyj2008-10-09 19:58
A A3 = A1; 调用的好象也是拷贝构造函数吧?
A3 = A1; 这个好象 才调用复制操作吧?
#13
song42008-10-10 09:04
[bo][un]很远的那颗星[/un] 在 2008-10-8 14:58 的发言:[/bo]



谁说构造函数没有参数?

这个问题随便BAIDU一下都一大堆,楼主不妨试一下...


谁说没有 默认拷贝构造函数?
争论这么半天还隐藏这么大问题
#14
冰烨2008-10-10 14:52
[bo][un]newyj[/un] 在 2008-10-9 19:58 的发言:[/bo]

A A3 = A1; 调用的好象也是拷贝构造函数吧?
A3 = A1; 这个好象 才调用复制操作吧?

是哦
1