分享
 
 
 

[原创]关于C++的构造函数, 复制构造函数 和 operator =

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

关于C++的构造函数, 复制构造函数 和 operator =

1.构造函数

构造函数的定义我就不说了,我想说的只有一点,看下面的例子:

class C1

{

public:

//数据成员

int m_n;

//构造函数

C1(int n = 0)

{

cout << "C1::C1()" << endl;

m_n = n;

}

};

int _tmain(int argc, _TCHAR* argv[])

{

C1 o(10);//1.调用构造函数

C1 o1 = 10;//2.同样可以通过编译,也是调用了构造函数

C1 o2;//3

o2 = 10;//4.调用构造函数,生产临时对象,再赋值给o2

return 0;

}

标1的地方很容易理解,直接调用构造函数,把10作为参数传递,但标2的地方多少有点费解了.把一个int 赋值给C1对象o2吗?不!看是一个赋值(=)实际上是初始化,也会调用构造函数(前提是存在适当形式的构造函数,比如上面,只有一个int参数,而=号右边的10也是一个int);

标4的地方同样调用了构造函数,把10传递给了构造函数,生产了一个临时对象,然后把这个临时对象赋值给了o2(这里要调用 operator =(),如果有的话)

不过看起来似乎有点别扭,我声明了一个C1的对象o1,却给了它一个int型的初始值.并且有时候这样的"转换"是危险的,需要避免(比如STL里面就有许多这样的例子),那就需要explicit关键字:

把构造函数改为这样:

//构造函数

explicit C1(int n = 0)

{

cout << "C1::C1()" << endl;

m_n = n;

}

再去编译上面的代码,编译器就会报错了.我们成功阻止了不受欢迎的转换. :)

2.复制构造函数

复制构造函数的原型是这样的:

T(const T& src)

具体到上面的类就是

//复制构造函数

C1(const C1& src)

{

cout << "Copy constructor" << endl;

m_n = src.m_n;

}

当然,这个类很简单,实际上根本不用再定义复制构造函数,系统默认的bitwise copy就够了.

//一个函数,返回C1类型

C1 f1()

{

C1 cTemp(10);//*

return cTemp;

}

int _tmain(int argc, _TCHAR* argv[])

{

C1 n = f1();//这里就是调用了复制构造函数

return 0;

}

注意:这个过程分别调用了一次构造函数(标*的地方),一次复制构造函数,如果把f1()里面改为:

return C1(10);

的话,就可以节省一次复制构造函数的调用了(相当于直接定义 C1 n(10)).

3.operator =

这个就比较简单了

C1& operator = (const C1& r)

{

if(&r == this) return *this;//防止自身赋值

m_n = r.m_n;

return *this;//支持连续赋值

}

如果定义了这个成员函数,在进行如下赋值操作时,就会调用该函数:

n2 = n1;//n2,n1都是C1类型的对象

当然你还可以定义其他参数类型的operator =()函数,以支持把其他类型的对象赋值给C1的对象.

需要说明的是,

n2 = n1;//n2,n1都是C1类型的对象

调用的是operator = 而不是 赋值构造函数 !很多的初学者(包括我)一开始容易迷惑.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有