临时对象专题

学习临时对象时的相关代码:

例1:

 1 /*
 2  *第一种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B Func(B b)
41 {
42     return b;
43 }
44 
45 void main()
46 {
47     B t1 = Func(5);
48 }
49 
50 //Out  put   
51 /*
52 Construct  By: 0x0012FF20  5  //隐式类型转换构建临时对象
53 Copy  Construct  0x0012FF7C   0x0012FF20  //拷贝构造函数进行传参(b = 临时对象)
54 Destructed   0x0012FF20  5   //摧毁临时对象
55 Destructed   0x0012FF7C  5   //摧毁对象t1
56 */ 

例2:

 1 /*
 2  *第二种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B Func(B b)
41 {
42     return b;
43 }
44 
45 void main()
46 {
47     B t1;
48     t1 = Func(5);
49 }
50 
51 //Out  put 
52 /*
53 Default  Construct:  0012FF58   //默认构造创建t1
54 Construct  By: 0012FE5C  5      //隐式类型转换创建临时对象
55 Copy  Construct  0012FE8C   0012FE5C  //拷贝构造函数传参(b=临时对象)
56 Destructed   0012FE5C  5        //摧毁临时对象
57 operator=   0012FF58   0012FE8C//赋值函数进行赋值(t1=b)
58 Destructed   0012FE8C  5    //摧毁对象b
59 Destructed   0012FF58  5    //摧毁对象t1
60 */

例3:

 1 /*
 2  *第三种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B Func(B b)
41 {
42     return b;
43 }
44 
45 void main()
46 {
47     B t1(1);
48     t1 = Func(t1);
49 }
50 
51 //Out  put
52 /*
53 Construct  By: 0012FF58  1   //构造函数创建t1
54 Copy  Construct  0012FE5C   0012FF58   //拷贝构造创建临时对象
55 Copy  Construct  0012FE8C   0012FE5C   //拷贝构造函数进行传参(构建对象b)
56 Destructed   0012FE5C  1     //摧毁临时对象
57 operator=   0012FF58   0012FE8C  //赋值函数进行赋值(t1=b)
58 Destructed   0012FE8C  1     //摧毁对象b
59 Destructed   0012FF58  1     //摧毁对象t1
60 */

例4:

 1 /*
 2  *第四种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B Func(B b)
41 {
42     return b;
43 }
44 
45 void main()
46 {
47     B t1(1);
48     B t2 = Func(t1);
49 }
50 
51 //Out  put  
52 /*
53 Construct  By: 0012FF58  1   //构造函数创建对象t1
54 Copy  Construct  0012FE60   0012FF58   //拷贝构造函数创建临时对象
55 Copy  Construct  0012FF4C   0012FE60   //拷贝构造函数传参(b=t1)
56 Destructed   0012FE60  1    //摧毁临时对象
57 Destructed   0012FF4C  1    //摧毁对象b
58 Destructed   0012FF58  1    //摧毁对象t1
59 */

例5:

 1 /*
 2  *第五种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B Func(B &b)
41 {
42     return b;
43 }
44 void main()
45 {
46     B t1(1);
47     B t2 = Func(t1);
48 }
49 
50 //Out  put  
51 /*
52 Construct  By: 0012FF58  1   //构造函数创建对象t1
53 Copy  Construct  0012FF4C   0012FF58   //拷贝构造函数进行赋值(t2=b)
54 Destructed   0012FF4C  1     //摧毁对象t2
55 Destructed   0012FF58  1     //摧毁对象t1
56 */

例6:

 1 /*
 2  *第六种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B & Func(B b)
41 {
42     return b;
43 }
44 void main()
45 {
46     B t1 = 5;
47     B t2 = Func(t1);
48 }
49 
50 //Out  put      
51 /*
52 Construct  By: 0012FF58  5       //隐式类型转换创建对象t1
53 Copy  Construct  0012FE60   0012FF58  //拷贝构造创建临时对象
54 Destructed   0012FE60  5         //摧毁临时对象
55 Copy  Construct  0012FF4C   0012FE60  //拷贝构造函数进行赋值(t2 = b)
56 Destructed   0012FF4C  1244768   //摧毁对象t2  //注意这个特殊启示
57 Destructed   0012FF58  5         //摧毁对象t1
58 */

例7:

 1 /*
 2  *第七种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B & Func(B b)
41 {
42     B t(3);
43     return t;
44 }
45 
46 void main()
47 {
48     B t1(1);
49     B t2(5);
50     t2 = Func(t1);
51 }
52 
53 //Out  put     
54 /*
55 Construct  By  :0012FF58  1   //构造函数创建对象t1
56 Construct  By  :0012FF4C  5   //构造函数创建对象t2
57 Copy  Construct  0012FE60   0012FF58   //拷贝构造函数创建临时对象
58 Construct  By  :0012FE44  3   //构造函数创建对象t
59 Destructed   0012FE44  3      //摧毁对象t
60 Destructed   0012FE60  1      //摧毁临时对象
61 operator=    0012FF4C   0012FE44  //拷贝构造函数进行赋值(t2=t)
62 Destructed   0012FF4C  -858993460 //摧毁对象t2
63 Destructed   0012FF58  1      //摧毁对象t1
64 */

例8:

 1 /*
 2  *第八种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23 //     B &operator=(const B &obj)
24 //     {
25 //         if(this!=&obj)
26 //         {
27 //             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28 //             data=obj.data;
29 //         }
30 //         return *this;
31 //     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B & Func(B b)
41 {
42     B t(3);
43     return t;
44 }
45 
46 void main()
47 {
48     B t1(1);
49     B t2(5);
50     t2 = Func(t1);   //?? 有无赋值函数的区别
51 }
52 
53 //Out  put
54 /*
55 Construct  By  :0012FF58  1   //构造函数创建对象t1
56 Construct  By  :0012FF4C  5   //构造函数创建对象t2
57 Copy  Construct  0012FE60   0012FF58   //拷贝构造函数创建临时对象
58 Construct  By  :0012FE44  3   //构造函数创建对象t
59 Destructed   0012FE44  3      //摧毁对象t
60 Destructed   0012FE60  1      //摧毁临时对象
61 Destructed   0012FF4C  3      //摧毁对象t2
62 Destructed   0012FF58  1      //摧毁对象t1
63 */

例9:

 1 /*
 2  *第九种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B Func(B &b)
41 {
42     B t3(b);
43     return t3;
44 }
45 void main()
46 {
47     B t1=5;
48     B t2=Func(t1);
49 }
50 
51 //Out  put    //分步解析
52 /*
53 Construct  By: 0012FF58  5   //隐式类型转换创建对象t1
54 Copy  Construct  0012FE54   0012FF58  //拷贝构造函数创建临时对象
55 Copy  Construct  0012FF4C   0012FE54  //拷贝构造函数创建局部对象t3
56 Destructed   0012FE54  5   //摧毁临时对象
57 Destructed   0012FF4C  5   //摧毁局部对象t3
58 Destructed   0012FF58  5   //摧毁对象t1
59 */

例10:

 1 /*
 2  *第十种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B Func(B &b)
41 {
42     B t3(b);
43     return t3;
44 }
45 void main()
46 {
47     B t1 = 5;
48     B t2;
49     t2 = Func(t1);
50 }
51 
52 //Out   put   
53 /*
54 Construct  By: 0012FF58  5   //隐式类型转换创建对象t1
55 Default  Construct:  0012FF4C//默认创建对象t2
56 Copy  Construct  0012FE40   0012FF58  //拷贝构造函数创建局部对象t3
57 Copy  Construct  0012FE80   0012FE40  //拷贝构造函数创建临时对象
58 Destructed   0012FE40  5   //函数结束摧毁对象t3
59 operator=   0012FF4C   0012FE80  //赋值函数进行赋值(t2=临时对象)
60 Destructed   0012FE80  5  //摧毁临时对象
61 Destructed   0012FF4C  5  //摧毁对象t2
62 Destructed   0012FF58  5  //摧毁对象t1
63 */

例11:

 1 /*
 2  *第十一种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B & Func(B &b)
41 {
42     B t3(b);
43     return t3;
44 }
45 void main()
46 {
47     B t1 = 5;
48     B t2;
49     t2 = Func(t1);
50 }
51 
52 //Out  put     
53 /*
54 Construct  By: 0012FF58  5  //隐式类型转换构建对象t1
55 Default  Construct:  0012FF4C  //默认构造函数构建对象t2
56 Copy  Construct  0012FE64   0012FF58  //拷贝构造函数创建局部对象t3
57 Destructed   0012FE64  5   //函数结束摧毁局部对象t3
58 operator=   0012FF4C   0012FE64  //赋值函数进行赋值(t2=局部对象)
59 Destructed   0012FF4C  1245004  //摧毁对象t2  //? ?
60 Destructed   0012FF58  5   //摧毁对象t1
61 */

例12:

 1 /*
 2  *第十二种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 B & Func(B &b)
41 {
42     B t3(b);
43     return t3;
44 }
45 void main()
46 {
47     B t1(5);
48     B t2 = Func(t1);
49 }
50 
51 //Out  put   
52 /*
53 Construct  By: 0012FF58  5    //构造函数创建对象t1
54 Copy  Construct  0012FE64   0012FF58  //拷贝构造函数创建局部对象t3
55 Destructed   0012FE64  5  //摧毁局部对象t3
56 Copy  Construct  0012FF4C   0012FE64  //拷贝构造函数进行赋值(t2=t3)
57 Destructed   0012FF4C  1245004  //摧毁对象t2   //? 思考
58 Destructed   0012FF58  5    //摧毁对象t1 
59 */

例13:综合运用类中函数的示范程序:

 1 /*
 2  *第十三种情况:分步解析
 3 */
 4 #include<iostream>
 5 using namespace std;
 6 
 7 class B
 8 {
 9 public:
10     B()
11     {
12         cout<<"Default  Construct"<<"  "<<this<<endl;
13     }
14     B(int i):data(i)
15     {
16         cout<<"Construct  By: "<<this<<"  "<<data<<endl;
17     }
18     B(const B &b)
19     {
20         cout<<"Copy  Construct"<<"  "<<this<<"   "<<&b<<endl;
21         data = b.data;
22     }
23     B &operator=(const B &obj)
24     {
25         if(this!=&obj)
26         {
27             cout<<" operator= "<<this<<"  "<<&obj<<endl;
28             data=obj.data;
29         }
30         return *this;
31     }
32     ~B()
33     {
34         cout<<"Destructed"<<"   "<<this<<"  "<<data<<endl;
35     }
36 private:
37     int data;
38 };
39 
40 void Func(B &b)
41 {
42     B t3(b);
43 }
44 
45 void main()
46 {
47     cout<<"B  t1执行结果:"<<endl;
48     B t1;
49     cout<<"B  t2(5)执行结果:"<<endl;
50     B t2(5);
51     cout<<"B  t3(t2)执行结果:"<<endl;
52     B t3(t2);
53     cout<<"B  t4=6执行结果:"<<endl;
54     B t4=6;
55     cout<<"B  t5=t4执行结果:"<<endl;
56     B t5=t4;
57     cout<<"B  t6执行结果:"<<endl;
58     B t6;
59     cout<<"t6 = t5执行结果:"<<endl;
60     t6=t5;
61     cout<<"Func(t6)执行结果:"<<endl;
62     Func(t6);
63 }
64 
65 //Out  put
66 /*
67 B  t1执行结果:
68 Default  Construct:  0x0012FF70
69 B  t2(5)执行结果:
70 Construct  By: 0x0012FF6C  5
71 B  t3(t2)执行结果:
72 Copy  Construct  0x0012FF68   0x0012FF6C
73 B  t4=6执行结果:
74 Construct  By: 0x0012FF64  6 //饮食类型转换
75 B  t5=t4执行结果:
76 Copy  Construct  0x0012FF60   0x0012FF64
77 B t6执行结果:
78 Default  Construct:  0x0012FF5C
79 t6 = t5执行结果:
80 operator=   0x0012FF5C   0x0012FF60
81 Func(t6)执行结果:
82 Copy  Construct  0x0012FF00   0x0012FF5C
83 Destructed   0x0012FF00  6   //摧毁局部对象t3
84 Destructed   0x0012FF5C  6   //摧毁局部对象t6
85 Destructed   0x0012FF60  6   //摧毁局部对象t5
86 Destructed   0x0012FF64  6   //摧毁局部对象t4
87 Destructed   0x0012FF68  5   //摧毁局部对象t3
88 Destructed   0x0012FF6C  5   //摧毁局部对象t2
89 Destructed   0x0012FF70  0   //摧毁局部对象t1
90 */

 备注:前十二种示例完全可以说明传参与返回时,使用值与引用的区别。后一种主要解释一下类中函数的使用情况,在不同的情况下的调用区别。

作者:kaizen
声明:本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此声明,且在文章明显位置给出本文链接,否则保留追究法律责任的权利。
签名:顺序 选择 循环
原文地址:https://www.cnblogs.com/Braveliu/p/2844749.html