对象的优化

一、拷贝构造、赋值运算符重载的相关知识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;

class Test{
public:
Test(int a = 10): ma(a) { cout << "Test()" << endl; }
Test(const Test &t): ma(t.ma) { cout << "Test(const Test&)" << endl; }
Test& operator=(const Test &t){
cout << "operator=" << endl;
ma = t.ma;
return *this;
}
~Test() { cout << "~Test()" << endl; }
private:
int ma;
};

int main(){
Test t1;
Test t2(t1);
Test t3 = t1;

//Test(20)显式生成临时对象 生存周期:所在的语句
/*
c++编译器对于对象构造的优化:
用临时对象生成新对象的时候,临时对象就不产生了,直接构造新对象就可以了。
*/
Test t4 = Test(20); // Test t4(20)没有区别的!
cout << "-----------------" << endl;

t4 = t2; // t4已经存在,这是赋值
t4 = Test(30); // t4.operator=(const Test &t)
t4 = (Test)30; // int -> Test,强制转换编译器会看有没有合适的构造函数
t4 = 30; // 隐式生成临时对象 隐式类型转换,注意如果30换成一个char类型变量,那就不行了,因为没有对应的构造 函数。
cout << "-----------------" << endl;

Test *p = &Test(40); // p指向的是一个已经析构的临时对象
const Test &ref = Test(50);
// 使用引用引用一个临时变量,临时变量的周期就变为了变量的生命周期
// 自己思考为引用给变量起了一个别名,在引用的生命周期内,就可以继续访问这个临时变量了
cout << "-----------------" << endl;

return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
using namespace std;

class Test{
public:
Test(int a = 5, int b = 5): ma(a), mb(b){
cout << "Test(int, int)" << endl;
}
Test(const Test &src): ma(src.ma), mb(src.mb){
cout << "Test(const Test&)" << endl;
}
void operator=(const Test &src){
ma = src.ma;
mb = src.mb;
cout << "operator=" << endl;
}
~Test() { cout << "~Test()" << endl; }
private:
int ma;
int mb;
};

Test t1(10, 10); //1. Test(int , int)
int main(){
Test t2(20, 20); //3. Test(int , int)
Test t3 = t2; // 4.Test(const Test&)
static Test t4 = Test(30, 30); //5. Test(int, int)
t2 = Test(40, 40); //6.Test(int, int), operetor=, ~Test()
t2 = (Test)(50, 50); //7.Test(int, int), operetor=, ~Test()
t2 = 60; //8.Test(int, int), operetor=, ~Test()
Test *p1 = new Test(70, 70); // 9.Test(int, int),堆上需要显式释放
Test *p2 = new Test[2]; // 10.Test(int, int), Test(int, int)
Test *p3 = &Test(80, 80); //11.Test(int, int), ~Test()
const Test &p4 = Test(90, 90); //12.Test(int, int)
delete p1; // 13.~Test()
delete []p2; // 14. ~Test(), ~Test()
}
Test t5(100, 100); //2. Test(int , int)
// 注意,t4的析构最晚,它在数据段,需要等程序结束。