在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
对于普通类型的对象来说,它们之间的复制是很简单的,例如: #include <iostream>
using namespace std; class CExample { private: int a; public: CExample(int b) { a=b;} void Show () { cout<<a<<endl; } }; int main() { CExample A(100); CExample B=A; B.Show (); return 0; } 运行程序,屏幕输出100。从以上代码的运行结果可以看出,系统为对象B分配了内存并完成了与对象A的复制过程。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。下面举例说明拷贝构造函数的工作过程。 #include <iostream>
using namespace std; class CExample { private: int a; public: CExample(int b) { a=b;} CExample(const CExample& C) { a=C.a; } void Show () { cout<<a<<endl; } }; int main() { CExample A(100); CExample B=A; B.Show (); return 0; } CExample(const 当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数: 如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。位拷贝又称浅拷贝,后面将进行说明。 自定义拷贝构造函数是一种良好的编程风格,它可以阻止编译器形成默认的拷贝构造函数,提高源码效率。 在某些状况下,类内成员变量需要动态开辟堆内存,如果 深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。下面举个深拷贝的例子。 #include <iostream> int 浅拷贝资源后在释放资源的时候会产生资源归属不清的情况导致程序运行出错。 Test(Test 调用,如果你没有自定义拷贝构造函数的时候,系统将会提供给一个默认的拷贝构造函数来完成这个过程,上面代码的复制核心语句就是通过Test(Test &c_t)拷贝构造函数内的p1=c_t.p1;语句完成的。 转自:http://www.cnblogs.com/BlueTzar/articles/1223313.html __________________________________________________________________ 拷贝构造函数是C++最基础的概念之一,大家自认为对拷贝构造函数了解么?请大家先回答一下三个问题: 1. 以下函数哪个是拷贝构造函数,为什么? 2. 一个类中可以存在多于一个的拷贝构造函数吗? 3. 写出以下程序段的输出结果, 并说明为什么?
解答如下: 1. 对于一个类X,如果一个构造函数的第一个参数是下列之一: 2.类中可以存在超过一个拷贝构造函数, 注意,如果一个类中只存在一个参数为X&的拷贝构造函数,那么就不能使用const X或volatile 如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数. 默认拷贝构造函数的行为如下:
3. 原因很简单, 成员函数模版并不改变语言的规则,而语言的规则说,如果程序需要一个拷贝构造函数而你没有声明它,那么编译器会为你自动生成一个. 转自: |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论