美文网首页
C++类对象初始化方式总结

C++类对象初始化方式总结

作者: 程序爱好者 | 来源:发表于2019-07-23 22:28 被阅读0次

在《inside the c++ object model》一书中谈到copy constructor的构造操作,有三种情况下,会以一个object的内容作为另一个object的初值:

第一种情况: XX aa = a;

第二种情况: XX aa(a);

第三种情况: extern fun(XX aa); fun(a)函数调用

第四种情况: XX fun(){...}; XX a = fun();函数返回值的时候

下面我们就上述的四种情况来一一验证:

class ClassTest{

public:

ClassTest()//定义默认构造函数

{

c[0] = '\0';

cout << "ClassTest()" << endl;

}

ClassTest& operator=(const ClassTest &ct) //重载赋值操作符

{

strcpy_s(c, ct.c);

cout << "ClassTest& operator=(const ClassTest &ct)" << endl;

return *this;

}

ClassTest(const char *pc)

{

strcpy_s(c, pc);

cout << "ClassTest (const char *pc)" << endl;

ClassTest(const ClassTest& ct)//复制构造函数

{

strcpy_s(c, ct.c);

cout << "ClassTest(const ClassTest& ct)" << endl;

}

private:

char c[256];

};

ClassTest func(ClassTest temp){

return temp;

}

int main(){

cout << "ct1: ";

ClassTest ct1("ab");//直接初始化 

cout << "ct2: ";

ClassTest ct2 = "ab";//复制初始化 

/*输出说明:

ClassTest ct2 = "ab";

它本来是要这样来构造对象的:首先调用构造函数ClassTest(const char *pc)函数创建一个临时对象,

然后调用复制构造函数,把这个临时对象作为参数,构造对象ct2。然而编译也发现,复制构造函数是

公有的,即你明确地告诉了编译器,你允许对象之间的复制,而且此时它发现可以通过直接调用重载的

构造函数ClassTest(const char *pc)来直接初始化对象,而达到相同的效果,所以就把这条语句优化为

ClassTest ct2("ab")。

*/

cout << "ct3: ";

ClassTest ct3 = ct1;//复制初始化 

cout << "ct4: ";

ClassTest ct4(ct1);//直接初始化 

cout << "ct5: ";

ClassTest ct5 = ClassTest();//复制初始化

cout << "ct6: ";

ClassTest ct6;//复制初始化

ct6 = "caoyan is a good boy!";

cout << "ct7: ";

ClassTest ct7;

ct7 = func(ct6);

return 0;

}

测试结果:

我们可以看到,比较复杂的是ct6和ct7,其中ct6还是比较好理解的,ct7这种情况比较难懂,为什么会有两个拷贝构造函数的调用????

第一次拷贝构造函数的调用:第一次很简单,是因为函数参数的传递,将ct6作为参数传递给temp,用ct6的值初始化temp会调用拷贝构造函数;

第二次拷贝构造函数的调用:因为要返回一个ClassTest对象,我们的编译器怎么做????首先它将temp对象拷贝到func函数的上一级栈帧中,它的上一级栈帧是main函数的栈帧,那么当函数返回时,参数出栈,temp对象的内存空间就会被收回,但是它的值已经被拷贝到main栈帧的一个预留空间中,所以从temp到预留空间的拷贝也是调用拷贝构造函数,最后一步就是给ct7赋值,毫无疑问调用赋值构造函数;对栈帧不同的同学可以看看《程序员的自我修养》一书,里面讲得很详细!!!!

相关文章

  • C++类对象初始化方式总结

    在《inside the c++ object model》一书中谈到copy constructor的构造操作,...

  • c++ python java

    c++ 初始化 C++类中成员变量的初始化有两种方式 - yu132563的专栏 - CSDN博客 C++ 变量初...

  • C++二义性 多态 纯虚函数 模版函数

    1.C++源码中对象初始化方式 std::string 对char *的封装 C++源码中对象初始化 2.虚继承 ...

  • 成员初始化列表

    C++为类中提供类成员的初始化列表 类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数...

  • C++对象的初始化方式

    对象初始化可以分为默认初始化、直接初始化、拷贝初始化以及值初始化。C++的类默认提供了六种函数:构造函数、析构函数...

  • [C++] 对象初始化的方式

    初始化对象 C++提供两种使用构造函数来初始化对象的方式。 第一种方式是显式的调用构造函数。(在栈上分配内存 另一...

  • 类的复用

    1.java代码的复用方式 继承初始化基类导出类对象包含一个基类的子对象,因此导出类初始化之前,编译器首先调用基类...

  • 1.2.05_C++ 拷贝构造函数

    C++ 类 & 对象 拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建...

  • C++拷贝构造函数总结

    C++的两种初始化方式 在阐述拷贝构造函数之前,先让我们来看一下C++支持的初始化方式。C++支持两种初始化方式。...

  • C++类的实例化对象的大小之SIZEOF()

    之所以写这篇《C++类的实例化对象的大小之sizeof()》总结一下。你不知道的C++类的实例化对象的大小之si...

网友评论

      本文标题:C++类对象初始化方式总结

      本文链接:https://www.haomeiwen.com/subject/zcuzlctx.html