复制构造函数

C++复制构造函数以及赋值操作符

守給你的承諾、 提交于 2019-12-10 04:12:49
当定义一个新类型的时候,需要显式或隐式地指定复制、赋值和撤销该类型的对象时会发生什么——这是通过定义特殊成员:复制构造函数、赋值操作符和析构函数来达到的。如果没有显式定义复制构造函数或者赋值操作符,编译器(通常)会为我们定义。 看看编译器默认的构造函数和赋值操作符做了些什么工作: class_a.h #ifndef _CLASS_A_H #define _CLASS_A_H class A { public: A(); A(int a); private: int a; }; #endif class_a.cpp #include "class_a.h" A::A(): a(0) { } A::A(int a) { this->a = a; } main.cpp #include "class_a.h" int main() { A obj1; //调用无形参构造函数 A obj2(2); //形参为int的构造函数 A obj3(obj1); //默认复制构造函数 A obj4 = 3; //调用形参为int的构造函数产生类A的临时变量,调用默认赋值操作符进行赋值 A obj5 = obj1; //调用默认赋值操作符 return 0; } 编译执行g++ -g main.cpp class_a.cpp 反汇编objdump -S a.out 可知:

C++ Primer Plus(十二)——类和动态内存分配

烂漫一生 提交于 2019-12-01 12:12:06
静态数据成员在类声明中声明,在包含类方法的文件中初始化。初始化时使用作用域运算符来指出静态成员所属的类。但如果静态成员是整型或枚举型const,则可以在类声明中初始化。 strlen返回字符串长度,但不含末尾的空字符 字符串并不保存在对象中,而是单独保存在堆内存中,对象仅保存了到哪去查找字符串的信息。 删除对象可以释放对象本身占用的内存,但不能自动删释放属于对象成员的指针所指向的内存,所以必须使用析构函数并用delete释放这种内存。 按值传递、生成临时对象时,都将调用复制构造函数。 如果类中包含了使用new初始化的指针成员,则应当定义一个复制构造函数,以复制指向的数据,而不是指针,这类称为深度复制,复制的另一种形式是调用隐式复制构造函数,进行浅复制,浅复制仅仅复制指针信息,而不会深入挖掘以复制指针引用的结构。 与复制构造函数相似,赋值运算符的隐式实现也对成员进行逐个复制。 复制构造函数和赋值构造函数的重新定义上的区别: 由于目标对象可能引用了以前分配的数据,所以函数应用delete[ ] 来释放这些数据 函数应当避免将对象赋给自身;否则给对象重新赋值前,释放内存操作可能删除对象的内容 函数返回一个指向调用对象的引用 delete[ ] 与使用new[ ]初始化指针和空指针都兼容,对于以其他方式初始化的指针,使用delete[ ]时,结果将是不确定的,如 new char[1]与