码迷,mamicode.com
首页 > 编程语言 > 详细

C++构造函数

时间:2017-09-05 01:33:29      阅读:261      评论:0      收藏:0      [点我收藏+]

标签: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 }
View Code

在上述代码中,要注意函数的默认参数只能出现在函数的定义或声明中,不能同时出现在定义和声明中。

使用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]

 

C++构造函数

标签:uil   class   bsp   turn   for   对象   tar   let   err   

原文地址:http://www.cnblogs.com/pursuiting/p/7476437.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!