尝试着自己写一点练习,但母语为Java的我对于C++似乎还是有点不适应
还是很微妙呀,例如容器在堆上的行为,在栈上的行为,混合时的行为,delete的行为等
做了个研究,写了点代码,不过其中还是有点疑惑
当一个对象放在栈上的时候,对象包含的vector对象会只保留一个地址,这个地址指向一个与堆/栈均不同的位置。
这个位置在哪里?已知的是比堆要高很多
上代码
 1
#ifndef PERSON_H
2
#define PERSON_H
3
4
#include <iostream>
5
#include <string>
6
#include <vector>
7
8
using namespace std;
9
10
class Person
11
{
12
public:
13
    Person(string name,int size);
14
    string getName();
15
    void setName(string name);
16
    virtual string getType();
17
    vector <string> family;
18
private:
19
    string name;
20
};
21
22
class Wife : public Person {
23
public:
24
    Wife(string name,int year);
25
    int getYear();
26
    virtual string getType();
27
protected:
28
private:
29
    int year;
30
};
31
32
#endif
#ifndef PERSON_H2
#define PERSON_H3

4
#include <iostream>5
#include <string>6
#include <vector>7

8
using namespace std;9

10
class Person11
{12
public:13
    Person(string name,int size);14
    string getName();15
    void setName(string name);16
    virtual string getType();17
    vector <string> family;18
private:19
    string name;20
};21

22
class Wife : public Person {23
public:24
    Wife(string name,int year);25
    int getYear();26
    virtual string getType();27
protected:28
private:29
    int year;30
};31

32
#endif
  1
#include "Person.h"
2
#include <cstring>
3
#include <sstream>
4
5
6
Person::Person(string name,int size)
7
{
8
    this->name = name;
9
    this->family = vector<string>(size);
10
}
11
string Person::getName(){
12
    return this->name;
13
}
14
string Person::getType(){
15
    return "Person";
16
}
17
18
void Person::setName(string name){
19
    this->name = name;
20
}
21
Wife::Wife(string name, int year) :Person(name,0)
22
{
23
    this->year = year;
24
}
25
int Wife::getYear(){
26
    return this->year;
27
}
28
string Wife::getType(){
29
    return "Wife";
30
}
31
32
33
int main(){
34
    //堆内存分配示例
35
    Person *p = new Person("Gan",0);
36
    //vector容器示例
37
38
    //注意:值复制,不能这样得到并修改p的family
39
    //vector<string> this_family = p->family;
40
41
    //应该用指针或引用
42
    vector<string> &this_family = p->family;
43
44
    //向family增加元素后,family到底是放到了栈上还是堆上?
45
    //p在堆上时,vector也在堆上
46
    //vector始终保持连续
47
    //与Vector相同位置?
48
    //p在栈上时,vector不在栈上,在另一个可能的堆上或者是栈上
49
    //但是与p在堆上时的情况不同
50
    //释放p之后,family会被释放吗?
51
    //全部都会
52
53
    //注意,如果vector初始容量不为0,则push_back方法会从初始容量之后加入元素
54
    this_family.push_back("Yin");
55
    this_family.push_back("Chen");
56
    this_family.push_back("Hui");
57
    this_family.push_back("END");
58
    
59
    //vector迭代器示例
60
    vector<string>::iterator pos = p->family.begin();
61
    vector<string>::iterator end = p->family.end();
62
    //测试p->family 与 this_family 是否指向同一对象
63
    cout << (pos == end) << endl;
64
    //++pos 效率在某些情况下比pos++高
65
    for (;pos != end; ++pos){
66
        cout << pos->substr(1,2) << endl;
67
        //vector 迭代器搜索
68
        if (*pos == "Chen"){
69
            //必须更新所有迭代器,否则pos,end变成野指针
70
            //如果在for循环中每次都取得end,则更好
71
            vector<string>::iterator new_pos = p->family.erase(pos);
72
            //pos已经变成野指针
73
            //更新
74
            pos = new_pos;
75
            end = p->family.end();
76
        }
77
    }
78
79
    //继承示例
80
    Wife *mywife = new Wife("Yin Chenhui",2007);
81
    cout << "Year: " << mywife->getYear() << endl;
82
83
    //多态示例
84
    vector <Person*> *people = new vector<Person*>();
85
    people->push_back(p);
86
    people->push_back(mywife);
87
88
    vector<Person*>::iterator pos2;
89
    int i = 0;
90
    for (pos2 = people->begin();pos2 !=people->end();pos2++){
91
        //多态方法
92
        cout << "Person vector: " << i << ' '<< (*pos2)->getName() 
93
            << ' ' << (*pos2)->getType() << endl;
94
        ++i;
95
    }
96
    delete people;
97
    delete mywife;
98
    delete p;
99
100
    //栈分配
101
    Person gangan("gangan",0);
102
    gangan.family.push_back("1gangan1");
103
    gangan.family.push_back("2gangan2");
104
    gangan.family.push_back("3gangan3");
105
106
    cout << "gangan's Address: " << &gangan << endl;
107
}
#include "Person.h"2
#include <cstring>3
#include <sstream>4

5

6
Person::Person(string name,int size)7
{8
    this->name = name;9
    this->family = vector<string>(size);10
}11
string Person::getName(){12
    return this->name;13
}14
string Person::getType(){15
    return "Person";16
}17

18
void Person::setName(string name){19
    this->name = name;20
}21
Wife::Wife(string name, int year) :Person(name,0)22
{23
    this->year = year;24
}25
int Wife::getYear(){26
    return this->year;27
}28
string Wife::getType(){29
    return "Wife";30
}31

32

33
int main(){34
    //堆内存分配示例35
    Person *p = new Person("Gan",0);36
    //vector容器示例37

38
    //注意:值复制,不能这样得到并修改p的family39
    //vector<string> this_family = p->family;40

41
    //应该用指针或引用42
    vector<string> &this_family = p->family;43

44
    //向family增加元素后,family到底是放到了栈上还是堆上?45
    //p在堆上时,vector也在堆上46
    //vector始终保持连续47
    //与Vector相同位置?48
    //p在栈上时,vector不在栈上,在另一个可能的堆上或者是栈上49
    //但是与p在堆上时的情况不同50
    //释放p之后,family会被释放吗?51
    //全部都会52

53
    //注意,如果vector初始容量不为0,则push_back方法会从初始容量之后加入元素54
    this_family.push_back("Yin");55
    this_family.push_back("Chen");56
    this_family.push_back("Hui");57
    this_family.push_back("END");58
    59
    //vector迭代器示例60
    vector<string>::iterator pos = p->family.begin();61
    vector<string>::iterator end = p->family.end();62
    //测试p->family 与 this_family 是否指向同一对象63
    cout << (pos == end) << endl;64
    //++pos 效率在某些情况下比pos++高65
    for (;pos != end; ++pos){66
        cout << pos->substr(1,2) << endl;67
        //vector 迭代器搜索68
        if (*pos == "Chen"){69
            //必须更新所有迭代器,否则pos,end变成野指针70
            //如果在for循环中每次都取得end,则更好71
            vector<string>::iterator new_pos = p->family.erase(pos);72
            //pos已经变成野指针73
            //更新74
            pos = new_pos;75
            end = p->family.end();76
        }77
    }78

79
    //继承示例80
    Wife *mywife = new Wife("Yin Chenhui",2007);81
    cout << "Year: " << mywife->getYear() << endl;82

83
    //多态示例84
    vector <Person*> *people = new vector<Person*>();85
    people->push_back(p);86
    people->push_back(mywife);87

88
    vector<Person*>::iterator pos2;89
    int i = 0;90
    for (pos2 = people->begin();pos2 !=people->end();pos2++){91
        //多态方法92
        cout << "Person vector: " << i << ' '<< (*pos2)->getName() 93
            << ' ' << (*pos2)->getType() << endl;94
        ++i;95
    }96
    delete people;97
    delete mywife;98
    delete p;99

100
    //栈分配101
    Person gangan("gangan",0);102
    gangan.family.push_back("1gangan1");103
    gangan.family.push_back("2gangan2");104
    gangan.family.push_back("3gangan3");105

106
    cout << "gangan's Address: " << &gangan << endl;107
}
                    
                



                
            
        
浙公网安备 33010602011771号