wordpress做社区网站,内部网站建设公司,宁波网站seo诊断工具,网站建设需要域名还有什么对于普通类型的对象来说#xff0c;它们之间的复制是很简单的#xff0c;例如#xff1a; int a88; int ba; 而类对象与普通对象不同#xff0c;类对象内部结构一般较为复杂#xff0c;存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include iostreamu…
对于普通类型的对象来说它们之间的复制是很简单的例如 int a88; int ba; 而类对象与普通对象不同类对象内部结构一般较为复杂存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include iostream using namespace std; class CExample { private: int a; public: CExample(int b) { ab;} void Show () { coutaendl; } }; int main() { CExample A(100); CExample BA; B.Show (); return 0; } 运行程序屏幕输出100。从以上代码的运行结果可以看出系统为对象B分配了内存并完成了与对象A的复制过程。就类对象而言相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。下面举例说明拷贝构造函数的工作过程。 #include iostream using namespace std; class CExample { private: int a; public: CExample(int b) { ab;} CExample(const CExample C) { aC.a; } void Show () { coutaendl; } }; int main() { CExample A(100); CExample BA; B.Show (); return 0; } CExample(const CExample C)就是我们自定义的拷贝构造函数。可见拷贝构造函数是一种特殊的构造函数函数的名称必须和类名称一致它的唯一的一个参数是本类型的一个引用变量该参数是const类型不可变的。例如类X的拷贝构造函数的形式为X(X x)。
当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候拷贝构造函数就会被自动调用。也就是说当类的对象需要拷贝时拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数 一个对象以值传递的方式传入函数体 一个对象以值传递的方式从函数返回 一个对象需要通过另外一个对象进行初始化。
如果在类中没有显式地声明一个拷贝构造函数那么编译器将会自动生成一个默认的拷贝构造函数该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝后面将进行说明。
自定义拷贝构造函数是一种良好的编程风格它可以阻止编译器形成默认的拷贝构造函数提高源码效率。 浅拷贝和深拷贝 在某些状况下类内成员变量需要动态开辟堆内存如果实行位拷贝也就是把对象里的值完全复制给另一个对象如AB。这时如果B中有一个成员变量指针已经申请了内存那A中的那个成员变量也指向同一块内存。这就出现了问题当B把内存释放了如析构这时A内的指针就是野指针了出现运行错误。 深拷贝和浅拷贝可以简单理解为如果一个类拥有资源当这个类的对象发生复制过程的时候资源重新分配这个过程就是深拷贝反之没有重新分配资源就是浅拷贝。下面举个深拷贝的例子。
#include iostream using namespace std; class CA { public: CA(int b,char* cstr) { ab; strnew char[b]; strcpy(str,cstr); } CA(const CA C) { aC.a; strnew char[a]; //深拷贝 if(str!0) strcpy(str,C.str); } void Show() { coutstrendl; } ~CA() { delete str; } private: int a; char *str; };
int main() { CA A(10,Hello!); CA BA; B.Show(); return 0; } 深拷贝和浅拷贝的定义可以简单理解成如果一个类拥有资源(堆或者是其它系统资源)当这个类的对象发生复制过程的时候这个过程就可以叫做深拷贝反之对象存在资源但复制过程并未复制资源的情况视为浅拷贝。
浅拷贝资源后在释放资源的时候会产生资源归属不清的情况导致程序运行出错。 Test(Test c_t)是自定义的拷贝构造函数拷贝构造函数的名称必须与类名称一致函数的形式参数是本类型的一个引用变量,且必须是引用。
当用一个已经初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候拷贝构造函数就会被自动调用如果你没有自定义拷贝构造函数的时候系统将会提供给一个默认的拷贝构造函数来完成这个过程上面代码的复制核心语句就是通过Test(Test c_t)拷贝构造函数内的p1c_t.p1;语句完成的。