标签:uil class bsp turn for 对象 tar let err
C++在对象的不同创建方法中,会调用不同的构造函数,下面的代码探讨了调用一般的默认构造函数和复制构造函数的情形
1 class A 2 { 3 private: 4 int v; 5 public: 6 A() 7 { 8 v = 0; 9 cout << "object created" << endl; 10 } 11 A(const A& a) { cout << "copy construct" << endl;} 12 //A(A& a) { cout << "copy" << endl;} 13 ~A() { cout << "object deleted" << endl; } 14 void setvalue(int); 15 int getvalue() { return v; } 16 }; 17 18 void A::setvalue(int value = 6) 19 { 20 v = value; 21 } 22 23 void CiteA(A& a) 24 { 25 cout << "cite a" << endl; 26 } 27 28 void CallA(A a) 29 { 30 cout << "call a" << endl; 31 } 32 33 int main() 34 { 35 A a; //calls A(), before function return, calls ~A() 36 A *b = new A(); //calls only A() 37 delete b; //calls only ~A(), it must be with new 38 39 A a2 = a; //calls A(const A& a) 40 A a3(a); //calls A(const A& a) 41 A(a4); //calls A() 42 //A a6 = A(a5); //error: a5 no declaration 43 A a6 = A(a4); //calls A(const A& a) 44 //A *a8 = new A(a7);//error: a7 no declaration 45 A *a8 = new A(a); //calls only A(const A& a) 46 delete a8; //calls only ~A(), it must be with new 47 CiteA(a); //don‘t call construction 48 CallA(a); //calls A(const A& a) 49 50 a.setvalue(); 51 cout << "v = " << a.getvalue() << endl; 52 // system("pause"); 53 54 return 0; 55 }
在上述代码中,要注意函数的默认参数只能出现在函数的定义或声明中,不能同时出现在定义和声明中。
使用msvc2013结果
1: "Celery Stalks at Midnight" object created 2: "Lettuce Prey" object created 3: "Spinach Leaves Bowl for Dollars" object created headline1: Celery Stalks at Midnight headline2: Lettuce Prey sports: Spinach Leaves Bowl for Dollars String passed by reference: "Celery Stalks at Midnight" headline1: Celery Stalks at Midnight String passed by value: "Lettuce Prey" "Lettuce Prey" object deleted, 2 left headline2: 葺葺葺葺葺葺葺葺葺葺葺葺DW(= Initialize one object to another: sailor: Spinach Leaves Bowl for Dollars Assign one object to another: 3: "C++" default object created knot: Celery Stalks at Midnight End of main() "Celery Stalks at Midnight" object deleted, 2 left "Spinach Leaves Bowl for Dollars" object deleted, 1 left "葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺葺S" object deleted, 0 left
是
object created object created object deleted copy construct copy construct object created copy construct copy construct object deleted cite a copy construct call a object deleted v = 6 请按任意键继续. . .
使用gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
object created object created object deleted copy construct copy construct object created copy construct copy construct object deleted cite a copy construct call a object deleted v = 6 object deleted object deleted object deleted object deleted object deleted
时
1: "Celery Stalks at Midnight" object created 2: "Lettuce Prey" object created 3: "Spinach Leaves Bowl for Dollars" object created headline1: Celery Stalks at Midnight headline2: Lettuce Prey sports: Spinach Leaves Bowl for Dollars String passed by reference: "Celery Stalks at Midnight" headline1: Celery Stalks at Midnight String passed by value: "Lettuce Prey" "Lettuce Prey" object deleted, 2 left headline2: Initialize one object to another: sailor: Spinach Leaves Bowl for Dollars Assign one object to another: 3: "C++" default object created knot: Celery Stalks at Midnight End of main() "Celery Stalks at Midnight" object deleted, 2 left "Spinach Leaves Bowl for Dollars" object deleted, 1 left "?v" object deleted, 0 left *** Error in `/media/xzgz/Code/practice/Code/C++/c++_project/CPlusGrammer/build-cpg-Desktop-Debug/cpg‘: double free or corruption (fasttop): 0x000000000076a080 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f62bf89b7e5] /lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f62bf8a437a] /lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f62bf8a853c] /media/xzgz/Code/practice/Code/C++/c++_project/CPlusGrammer/build-cpg-Desktop-Debug/cpg[0x400cd5] /media/xzgz/Code/practice/Code/C++/c++_project/CPlusGrammer/build-cpg-Desktop-Debug/cpg[0x40102c] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f62bf844830] /media/xzgz/Code/practice/Code/C++/c++_project/CPlusGrammer/build-cpg-Desktop-Debug/cpg[0x400a09] ======= Memory map: ======== 00400000-00402000 r-xp 00000000 08:05 619273 /media/xzgz/Code/practice/Code/C++/c++_project/CPlusGrammer/build-cpg-Desktop-Debug/cpg 00601000-00602000 r--p 00001000 08:05 619273 /media/xzgz/Code/practice/Code/C++/c++_project/CPlusGrammer/build-cpg-Desktop-Debug/cpg 00602000-00603000 rw-p 00002000 08:05 619273 /media/xzgz/Code/practice/Code/C++/c++_project/CPlusGrammer/build-cpg-Desktop-Debug/cpg 00758000-0078a000 rw-p 00000000 00:00 0 [heap] 7f62b8000000-7f62b8021000 rw-p 00000000 00:00 0 7f62b8021000-7f62bc000000 ---p 00000000 00:00 0 7f62bf51b000-7f62bf623000 r-xp 00000000 08:09 2753340 /lib/x86_64-linux-gnu/libm-2.23.so 7f62bf623000-7f62bf822000 ---p 00108000 08:09 2753340 /lib/x86_64-linux-gnu/libm-2.23.so 7f62bf822000-7f62bf823000 r--p 00107000 08:09 2753340 /lib/x86_64-linux-gnu/libm-2.23.so 7f62bf823000-7f62bf824000 rw-p 00108000 08:09 2753340 /lib/x86_64-linux-gnu/libm-2.23.so 7f62bf824000-7f62bf9e4000 r-xp 00000000 08:09 2753345 /lib/x86_64-linux-gnu/libc-2.23.so 7f62bf9e4000-7f62bfbe4000 ---p 001c0000 08:09 2753345 /lib/x86_64-linux-gnu/libc-2.23.so 7f62bfbe4000-7f62bfbe8000 r--p 001c0000 08:09 2753345 /lib/x86_64-linux-gnu/libc-2.23.so 7f62bfbe8000-7f62bfbea000 rw-p 001c4000 08:09 2753345 /lib/x86_64-linux-gnu/libc-2.23.so 7f62bfbea000-7f62bfbee000 rw-p 00000000 00:00 0 7f62bfbee000-7f62bfc04000 r-xp 00000000 08:06 669579 /media/xzgz/Ubuntu/Ubuntu/Caffe/anaconda2/lib/libgcc_s.so.1 7f62bfc04000-7f62bfe03000 ---p 00016000 08:06 669579 /media/xzgz/Ubuntu/Ubuntu/Caffe/anaconda2/lib/libgcc_s.so.1 7f62bfe03000-7f62bfe04000 rw-p 00015000 08:06 669579 /media/xzgz/Ubuntu/Ubuntu/Caffe/anaconda2/lib/libgcc_s.so.1 7f62bfe04000-7f62bff76000 r-xp 00000000 08:06 711828 /media/xzgz/Ubuntu/Ubuntu/Caffe/anaconda2/lib/libstdc++.so.6 7f62bff76000-7f62c0176000 ---p 00172000 08:06 711828 /media/xzgz/Ubuntu/Ubuntu/Caffe/anaconda2/lib/libstdc++.so.6 7f62c0176000-7f62c0180000 r--p 00172000 08:06 711828 /media/xzgz/Ubuntu/Ubuntu/Caffe/anaconda2/lib/libstdc++.so.6 7f62c0180000-7f62c0182000 rw-p 0017c000 08:06 711828 /media/xzgz/Ubuntu/Ubuntu/Caffe/anaconda2/lib/libstdc++.so.6 7f62c0182000-7f62c0186000 rw-p 00000000 00:00 0 7f62c0186000-7f62c01ac000 r-xp 00000000 08:09 2753323 /lib/x86_64-linux-gnu/ld-2.23.so 7f62c0384000-7f62c0389000 rw-p 00000000 00:00 0 7f62c03a8000-7f62c03ab000 rw-p 00000000 00:00 0 7f62c03ab000-7f62c03ac000 r--p 00025000 08:09 2753323 /lib/x86_64-linux-gnu/ld-2.23.so 7f62c03ac000-7f62c03ad000 rw-p 00026000 08:09 2753323 /lib/x86_64-linux-gnu/ld-2.23.so 7f62c03ad000-7f62c03ae000 rw-p 00000000 00:00 0 7ffece974000-7ffece995000 rw-p 00000000 00:00 0 [stack] 7ffece9a0000-7ffece9a2000 r--p 00000000 00:00 0 [vvar] 7ffece9a2000-7ffece9a4000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
标签:uil class bsp turn for 对象 tar let err
原文地址:http://www.cnblogs.com/pursuiting/p/7476437.html