028-86922220

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

c++对象模型 构造函数、拷贝构造和拷贝复制

default constructor

含有default constructor的member class object

//B内含A
class A {
    public:
    	A();
    	A(int);
    ...
}

class B{
    public:
    B a;
    char* str;
}

//由于A有default constructor,而B内含A且B没有任何constructor,因此编译器需要为B合成一个default constructor,让其来调用A的default constructor处理B::a

//此处B中被合成的default constructor样子
inline
B::B()
{
    a.A::A();
}

含有default constructor 的 base class

含有virtual functions的 class

class A
{
    public:
    	virtual void do() = 0;
}

void do( const A& a ) { a.do(); };

void act()
{
    //B和C派生自A
    B b;
    C c;
    
    do( b );
    do( c );
}

含有virtual base class的class

copy constructor

default memberwise initialization

不展现bitwise copy semantics

对于第一、第二种情况

对于第三、第四种情况

program transformation semantics

explict initialization

​ 有这样一段代码:

class X{...};	//定义了copy constructor

X x;

void do()
{
    X x1(x);
    X x2 = x;
    X x3 = X(x);
}

argument initialization

void do( X x );

X x1;
do(x1);

return value initialization

X do()
{
    X xx;
    ...
    return xx;
}

是否需要copy constructor?

member initialization list

class A()
{
    String _name;
    int _value;
 	
public:
    A()
    {
        _name = 0;
        _value = 0;
    }
}

//此时A constructor会产生一个临时object,再将其初始化,随后以assignment运算符将临时Object传递给_name,最后摧毁临时object
//以下是扩张
A::A()
{
    _name.String::String();
    
    String temp = String(0);
    
    //memberwise拷贝
    _name.String::operator=(temp);
    
    temp.String::~String();
    
    _value = 0;
}

文章题目:c++对象模型 构造函数、拷贝构造和拷贝复制
URL链接:http://www.tsicrk.com/article/dsoiiod.html

其他资讯

让你的专属顾问为你服务

0.6654s