关于C++python多个构造函数数的一个问题

C++复制构造函数的调用中的问题?
[问题点数:40分,结帖人liyangxie00]
C++复制构造函数的调用中的问题?
[问题点数:40分,结帖人liyangxie00]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2012年1月 扩充话题大版内专家分月排行榜第二
2012年9月 Windows专区大版内专家分月排行榜第一2012年9月 C/C++大版内专家分月排行榜第一2012年8月 Windows专区大版内专家分月排行榜第一
2012年9月 其他开发语言大版内专家分月排行榜第二2012年8月 VC/MFC大版内专家分月排行榜第二2012年8月 其他开发语言大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。后使用快捷导航没有帐号?
查看: 6145|回复: 1
1. 拷贝构造函数的定义
首先举个例子:class Base
{
public:
& && & Base();
& && & Base(Base& obj);& && && && && && && && && &&&//1
& && & Base(const Base& obj);& && && && && && &//2
& && & Base(Base& obj, int x);& && && && && && &&&//3
& && & Base(Base& obj, int x=0, int y=0);&&//4
& && & Base& operator=(Base& obj);
protected:
& && & int&&i;
private:
};复制代码其中构造函数1,2,3,4哪个是拷贝构造函数,哪个不是?
要回答这个问题,需要先了解一下拷贝构造函数的定义:
拷贝构造函数是一种特殊的成员函数。该函数的功能是用一个已有的对象的值来初始化一个新构造的对象。拷贝构造函数实际上也是构造函数,它是在初始化时被调用来将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。
拷贝构造函数的定义格式为:& 类名 &::& 拷贝构造函数名 &(const & 类名 && & 引用名 &)复制代码其中 & 拷贝构造函数名 & 与类名相同。形参是一个该类的引用,且只能有一个形参。
2.&&拷贝构造函数的形式
对于一个类class Base, 如果一个构造函数的第一个参数是下列之一:
(1)& & Base::Base(Base& obj)
(2)& & Base::Base(const Base& obj)
(3)& & Base::Base(volatile Base& obj)
(4)& & Base::Base(const volatile Base& obj)
同时,函数没有其他参数;或者,其他参数都有默认值。那么这个函数就是拷贝构造函数。
3. 拷贝构造函数的行为
(1) 默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造.
(2) 拷贝构造函数对类中每一个数据成员递归地执行成员拷贝(memberwise Copy)的动作.
& && &&&(a) 如果数据成员为某一个类的对象, 那么调用此类的拷贝构造函数.
& && &&&(b) 如果数据成员是一个数组, 对数组的每一个执行按位拷贝.
& && &&&(c) 如果数据成员是一个数量, 如int,double,那么调用系统内建的赋值运算符对其进行赋值.
4. 拷贝构造函数的使用
(1) 用一个已知对象的值去初始化另一个对象Base oA;
Base oB(oA);& && && &//拷贝构造函数
Base oC = oA;& && &&&//拷贝构造函数
Base oD;
oD = oA;& && && && && &// operator=复制代码(2) 对象作为函数的参数传递时,把实参对象的值传给形参对象。
例如下面的函数void function(Base obj);
void function(const Base obj);复制代码但是如果函数参数是引用类型,那么则不会调用拷贝构造函数。原因很简单,因为实参和形参都是同一个对象,没有发生对象的初始化。例如:void function(Base& obj);& && && && &//不会调用拷贝构造函数
void function(const Base& obj);& & //不会调用拷贝构造函数复制代码(3) 当对象作为函数的返回值时,编译器会自动创建一个临时的类对象,调用拷贝构造函数对其进行复制,然后将对象返回。
例如:Base function()
{
Base* pObj = new B

return *pO
}复制代码和第(2)点相同,如果返回值是引用,也不好调用拷贝构造函数Base& function()
{
Base* pObj = new B

return *p;& && &////不会调用拷贝构造函数
}复制代码5. 深拷贝和浅拷贝
拷贝和浅拷贝的定义可以理解为:
深拷贝:如果一个类拥有资源(堆,或者是其它系统资源),当这个类的对象发生复制过程的时候,这个过程就可以叫做深拷贝,
浅拷贝:如果对象存在资源但复制过程并未复制资源的情况视为浅拷贝。
6. 拷贝构造函数与operator=
默认的赋值运算的行为:首先调用父类的赋值运算。然后会为自己独有的各成员寻找赋值运算。如果成员的赋值运算符被重写,则调用这个重写的赋值运算符函数,如果这个重写的运算符函数是private,编译将无法通过。
默认的拷贝构造函数的行为:首先调用父类的拷贝构造函数。
好贴,顶。。。。
Powered by Discuz!
& Comsenz Inc.1.什么是默认构造函数?
一个函数是默认构造函数当且仅当调用它可以不需要传入任何参数。这个函数可以是用户自定义的,也可以是编译器产生的。下边的各种构造函数都是默认构造函数。
A(): x(0) {}
struct B: A
//no user-defined ctor.
//the compiler implicitly declares a default constructor
explicit C(int n=0, int m=0); // may be invoked with no arguments
2.编译器什么时候隐式声明默认构造函数?
有两个条件:
该类没有显式声明任何构造函数。--既然你都定义了,系统就不给你生成了。
数据成员中没有const和reference。--因为要初始化。
满足则隐式生成默认构造函数。这里强调“任何”,是指即使用户自定义了复制构造函数或一个需要多个参数的构造函数,默认构造函数也不会被隐式声明了。
所以,在定义一个类时要保证有默认的构造函数。
3.隐式声明默认构造函数都干了什么?
什么都不做!确切的说,无论是隐式还是显式声明,都不意味着构造函数被定义。我们看看下边的情况:
B(); //declaration only
B::B() {} //separate definition of the user-declared default constructor
C() {} //declaration and definition
//implicit declaration of a default constructor, no implicit definition
//implicit declaration + implicit definition of a default constructor
virtual void f();
virtual void f();
F(); ////explicit declaration a default constructor, user forgot a definition
最后一种情况是常见的错误,用户忘记定义这个显式声明的默认构造函数,这会导致链接错误——用户自定义的默认构造函数必须实现,哪怕是空实现。
我们注意到class D的情况隐式声明,但是没有隐式定义,既然没有隐式定义,那编译器何必隐式声明呢?
首先我们要进一步明确隐式声明和隐式定义的实质,这两个动作都是概念上的,编译器并非真的到你的头文件中插入了相关代码,只是编译器、连接器和程序的行为表现出好像进行了这样的动作。实际上,编译器就是设置了几个bit做了标识而已。之所以要进行隐式声明,编译器只是规定了一个类可以被如何使用(Each implicit declaration is like an article in a contract that states how a certain class may be used. When the compiler implicitly declares one of the special member functions, it grants certain authorizations to the user.)
4.什么时候编译器隐式定义一个隐式声明的默认构造函数?
在下列情况中的任何一种就会隐式定义:
带有虚拟成员函数的类——完成vptr的初始化。
子类——隐式执行基类默认构造函数。
using namespace
Bar(){cout&& &Default constructor!&&& pre&};
class Too:public Bar
//Foo::Foo(Bar bar):bar(bar){}
int main()
虚拟基类继承。
注:隐式定义的构造函数本身并不分配内存,它只是对一个类对象的初始而已,在声明对象时分配完内存,构造函数才被执行。并且也不对数据成员初始化。
阅读(...) 评论()

我要回帖

更多关于 两个构造函数 的文章

 

随机推荐