C++常见误区1 -- 必须返回一个对象时不要试图返回一个引用

 1 #include <iostream>
 2 
 3 class Person
 4 {
 5 public:
 6     Person(){}
 7 
 8     void setAge(int age) { this->m_iAge = age; }
 9 
10     int getAge() { return this->m_iAge; }
11 
12 private:
13     int m_iAge;
14 };
15 
16 Person* CreatePerson()
17 {
18     Person p;
19 
20     return &p;
21 }
22 
23 Person& CreatePerson2()
24 {
25     Person p;
26 
27     return p;
28 }
29 
30 Person* CreatePerson3()
31 {
32     Person *p = new Person();
33     
34     return p;
35 }
36 
37 Person CreatePerson4()
38 {
39     Person p;
40 
41     return p;
42 }
43 
44 
45 int main()
46 {
47     Person *pp = CreatePerson();
48     pp->setAge(10);
49     std::cout << pp->getAge() << std::endl;
50 
51     Person p = CreatePerson2();
52     p.setAge(10);
53     std::cout << p.getAge() << std::endl;
54 
55     Person *pp3 = CreatePerson3();
56     pp3->setAge(10);
57     std::cout << pp3->getAge() << std::endl;
58 
59     Person pp4 = CreatePerson4();
60     pp4.setAge(10);
61     std::cout << pp4.getAge() << std::endl;
62     
63     return 0;
64 }

代码有什么问题呢?

 

 

 

 1 Person* CreatePerson()
 2 {
 3     Person p; 
 4 
 5     return &p; //错误。p为栈对象,函数返回时内存已释放,返回的指针为野指针
 6 }
 7 
 8 Person& CreatePerson2()
 9 {
10     Person p;
11 
12     return p; //错误。p为栈对象,函数返回时内存已释放,不能引用
13 }
14 
15 Person* CreatePerson3()
16 {
17     Person *p = new Person();
18     
19     return p; //可以。p堆对象,不过要记得手动释放内存
20 }
21 
22 Person CreatePerson4()
23 {
24     Person p;
25 
26     return p; //正确。p为栈对象,函数返回会调用拷贝构造函数,重新拷贝一份。
27 }

 

posted @ 2016-07-12 19:02  jeffrey.chu  阅读(347)  评论(0编辑  收藏  举报

99code棋牌网