拷贝构造函数 都是在什么情况下调用???
/* ** 什么时候调用拷贝构造函数 ** */ #include <iostream> using namespace std; //日期类 class Date{ public: int year,month,day; Date(){//无参构造 cout << "日期类的构造函数" << endl; } ~Date(){ cout << "日期的析构函数" << endl; } #pragma 拷贝构造函数里面的参数类型必须是引用 Date (const Date& d3){ this->year = d3.year; this->month = d3.month; this->day = d3.day; cout << "拷贝构造函数Date (Date& d3)" << endl; } }; void fa(Date d){//在这个参数可以看出会创建一个新的临时变量d对象,相当于Date d = d;后面的d是传进来的,也就是通过相同类型对象来创建对象,所以这里会调用拷贝构造函数。 } //主函数 int main(){ Date d; cout << "===== 1 =====" << endl; fa(d); cout << "===== 2 =====" << endl; return 0; }
运行结果:
日期类的构造函数 ===== 1 ===== 拷贝构造函数Date (Date& d3) //fa函数进栈 日期的析构函数 //弹栈 ===== 2 ===== 日期的析构函数 Program ended with exit code: 0
void fb(Date &d){ //这里是给传进的参数创建别名(引用)不会创建新的对象 }
/主函数 int main(){ Date d; cout << "===== 1 =====" << endl; fa(d); cout << "===== 2 =====" << endl; fb(d); cout << "===== 3 =====" << endl; return 0; }
日期类的构造函数 ===== 1 ===== 拷贝构造函数Date (Date& d3) 日期的析构函数 ===== 2 ===== ===== 3 ===== 日期的析构函数 Program ended with exit code: 0
再创建一个参数类型是指针类型的函数 fc 如下:
void fc(Date *d){ //传进来的参数是指针类型 //这里创建了一个指针变量放在栈里面了,但是没有创建新的对象,指针指向的是传进来的对象的地址 }
//主函数 int main(){ Date d; cout << "===== 1 =====" << endl; fa(d); cout << "===== 2 =====" << endl; fb(d); cout << "===== 3 =====" << endl; fc(&d); cout << "===== 4 =====" << endl; return 0; }
日期类的构造函数 ===== 1 ===== 拷贝构造函数Date (Date& d3) 日期的析构函数 ===== 2 ===== ===== 3 ===== ===== 4 ===== 日期的析构函数从运行结果3和4之间也可以知道并没有创建新的对象。
再来,创建一个返回值类型是Date ,参数是引用类型的函数 fd 如下:
Date fd(Date &r){ return r; }
//主函数 int main(){ Date d; cout << "===== 1 =====" << endl; fa(d); cout << "===== 2 =====" << endl; fb(d); cout << "===== 3 =====" << endl; fc(&d); cout << "===== 4 =====" << endl; fd(d); cout << "===== 5 =====" << endl; return 0; }
日期类的构造函数 ===== 1 ===== 拷贝构造函数Date (Date& d3) 日期的析构函数 ===== 2 ===== ===== 3 ===== ===== 4 ===== 拷贝构造函数Date (Date& d3) 日期的析构函数 ===== 5 ===== 日期的析构函数 Program ended with exit code: 0
如果main主函数中修改如下,结果会如何呢?
cout << "===== 4 =====" << endl; Date d2 = fd(d); cout << "===== 5 =====" << endl;
理论上fd(d); 这里有一个拷贝构造函数和一个析构函数 还有这一步Date d2 = fd(d); 这里应该还有一个拷贝构造函数
运行结果如下:
日期类的构造函数 ===== 1 ===== 拷贝构造函数Date (Date& d3) 日期的析构函数 ===== 2 ===== ===== 3 ===== ===== 4 ===== 拷贝构造函数Date (Date& d3) ===== 5 ===== 日期的析构函数 日期的析构函数 Program ended with exit code: 0
Date& fe(Date &r){ return r; }
<p class="p1"><span class="s1"> cout</span><span class="s2"> << </span><span class="s3">"===== 5 ====="</span><span class="s2"> << </span><span class="s4">endl</span><span class="s2">;</span></p><p class="p2"><span class="s5"> </span><span class="s6">fe</span><span class="s5">(d);</span><span class="s7">//</span><span class="s3">参数</span><span class="s7"> </span><span class="s3">返回值都是引用类型的函数</span></p><p class="p1"><span class="s2"> </span><span class="s1">cout</span><span class="s2"> << </span><span class="s3">"===== 6 ====="</span><span class="s2"> << </span><span class="s4">endl</span><span class="s2">;</span></p><p class="p3"><span class="s3"> </span><span class="s8">Date</span><span class="s3"> d3 = </span><span class="s9">fe</span><span class="s3">(d);</span></p><p class="p1"><span class="s2"> </span><span class="s1">cout</span><span class="s2"> << </span><span class="s3">"===== 7 ====="</span><span class="s2"> << </span><span class="s4">endl</span><span class="s2">;</span></p><p class="p1"><span class="s1"> Date</span><span class="s2"> &d4 = </span><span class="s3">fe</span><span class="s2">(d); //创建一个引用变量接收函数返回的</span></p><p class="p2"><span class="s4"> </span><span class="s5">cout</span><span class="s4"> << </span><span class="s2">"===== 8 ====="</span><span class="s4"> << </span><span class="s6">endl</span><span class="s4">;</span></p>
日期类的构造函数 ===== 1 ===== 拷贝构造函数Date (Date& d3) 日期的析构函数 ===== 2 ===== ===== 3 ===== ===== 4 ===== 拷贝构造函数Date (Date& d3) ===== 5 ===== ===== 6 ===== 拷贝构造函数Date (Date& d3) <p class="p1"><span class="s1">===== 7 =====</span></p><p class="p1"><span class="s1">===== 8 =====</span></p><p class="p2"><span class="s1">日期的析构函数</span></p><p class="p2"><span class="s1">日期的析构函数</span></p><p class="p2"><span class="s1">日期的析构函数</span></p><p class="p3"><span class="s1">Program ended with exit code: 0</span></p>
cout << "===== 8 =====" << endl; Date d5[2] = {d,d2}; //数组里面有2个元素,分别用d和d2来赋值 <span class="s1" style="font-family: Arial, Helvetica, sans-serif;">cout</span><span class="s2" style="font-family: Arial, Helvetica, sans-serif;"> << </span><span class="s3" style="font-family: Arial, Helvetica, sans-serif;">"===== 9 ====="</span><span class="s2" style="font-family: Arial, Helvetica, sans-serif;"> << </span><span class="s4" style="font-family: Arial, Helvetica, sans-serif;">endl</span><span class="s2" style="font-family: Arial, Helvetica, sans-serif;">;</span><p class="p2"><span class="s3"> </span><span class="s5">Date</span><span class="s3"> d6[</span><span class="s6">5</span><span class="s3">];</span></p><p class="p1"><span class="s2"> </span><span class="s1">cout</span><span class="s2"> << </span><span class="s3">"===== 10 ====="</span><span class="s2"> << </span><span class="s4">endl</span><span class="s2">;</span></p>运行结果如下:
<p class="p1"><span class="s1"><span style="font-size:18px;">日期类的构造函数</span></span></p><p class="p2"><span class="s1"><span style="font-size:18px;">===== 1 =====</span></span></p><p class="p2"><span style="font-size:18px;"><span class="s2">拷贝构造函数</span><span class="s1">Date (Date& d3)</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p2"><span class="s1"><span style="font-size:18px;">===== 2 =====</span></span></p><p class="p2"><span class="s1"><span style="font-size:18px;">===== 3 =====</span></span></p><p class="p2"><span class="s1"><span style="font-size:18px;">===== 4 =====</span></span></p><p class="p2"><span style="font-size:18px;"><span class="s2">拷贝构造函数</span><span class="s1">Date (Date& d3)</span></span></p><p class="p2"><span class="s1"><span style="font-size:18px;">===== 5 =====</span></span></p><p class="p2"><span class="s1"><span style="font-size:18px;">===== 6 =====</span></span></p><p class="p2"><span style="font-size:18px;"><span class="s2">拷贝构造函数</span><span class="s1">Date (Date& d3)</span></span></p><p class="p2"><span class="s1"><span style="font-size:18px;">===== 7 =====</span></span></p><p class="p2"><span class="s1"><span style="font-size:18px;">===== 8 =====</span></span></p><p class="p2"><span style="font-size:18px;"><span class="s2">拷贝构造函数</span><span class="s1">Date (Date& d3)</span></span></p><p class="p2"><span style="font-size:18px;"><span class="s2">拷贝构造函数</span><span class="s1">Date (Date& d3)</span></span></p><p class="p2"><span class="s1"><span style="font-size:18px;">===== 9 =====</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期类的构造函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期类的构造函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期类的构造函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期类的构造函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期类的构造函数</span></span></p><p class="p2"><span class="s1"><span style="font-size:18px;">===== 10 =====</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p1"><span class="s1"><span style="font-size:18px;">日期的析构函数</span></span></p><p class="p3"><span class="s1"><span style="font-size:18px;">Program ended with exit code: 0</span></span></p>
<span style="font-size:24px;"> </span><span style="font-size:18px;"><span class="s1" style="font-family: Arial, Helvetica, sans-serif;">cout</span><span class="s2" style="font-family: Arial, Helvetica, sans-serif;"> << </span><span class="s3" style="font-family: Arial, Helvetica, sans-serif;">"===== 10 ====="</span><span class="s2" style="font-family: Arial, Helvetica, sans-serif;"> << </span><span class="s4" style="font-family: Arial, Helvetica, sans-serif;">endl</span><span class="s2" style="font-family: Arial, Helvetica, sans-serif;">;</span></span><p class="p2"><span style="font-size:18px;"><span class="s3"> d = d2; </span><span class="s5">//</span><span class="s6">赋值操作</span></span></p><p class="p1"><span style="font-size:18px;"><span class="s2"> </span><span class="s1">cout</span><span class="s2"> << </span><span class="s3">"===== 11 ====="</span><span class="s2"> << </span><span class="s4">endl</span><span class="s2">;</span></span></p><p class="p2"><span style="font-size:18px;"><span class="s3"> </span><span class="s7">Date</span><span class="s3"> *d7 = </span><span class="s8">new</span><span class="s3"> </span><span class="s7">Date</span><span class="s3">;</span></span></p><p class="p2"><span style="font-size:18px;"><span class="s3"></span></span></p><p class="p1"><span style="font-size:18px;"><span class="s1"> delete</span><span class="s2"> d7;</span></span></p><p></p><p class="p1"><span style="font-size:18px;"><span class="s2"> </span><span class="s1">cout</span><span class="s2"> << </span><span class="s3">"===== 12 ====="</span><span class="s2"> << </span><span class="s4">endl</span><span class="s2">;</span></span></p>运行结果:
<p class="p1"><span class="s1">===== 10 =====</span></p><p class="p1"><span class="s1">===== 11 =====</span></p><p class="p2"><span class="s1">日期类的构造函数</span></p><p class="p2"><span class="s1"></span></p><p class="p1"><span class="s1">日期的析构函数</span></p><p></p><p class="p1"><span class="s1">===== 12 =====</span></p>
cout << "===== 12 =====" << endl; Date *d8 = new Date(*d7); delete d8; cout << "===== 13 =====" << endl;运行结果如下:
<p class="p1"><span class="s1">===== 12 =====</span></p><p class="p1"><span class="s2">拷贝构造函数</span><span class="s1">Date (Date& d3)</span></p><p class="p2"><span class="s1">日期的析构函数</span></p><p class="p1"><span class="s1">===== 13 =====</span></p>
原文地址:http://blog.csdn.net/love9099/article/details/43447927