类对象和指针的区别

类对象和指针

代码

1
2
3
4
5
6
7
class Test{
public:
int a;
Test(){
a = 1;
}
};

类指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void test1() {
// 1. 两个类的指针,使用了new
Test* t1 = new Test();
t1->a = 10;
Test* t2 = new Test();
t2->a = 5;

// 2. 两个指针的所指向的地址不一样
cout << "&t1:" << t1 << " a = " << t1->a << endl;
cout << "&t2:" << t2 << " a = " << t2->a <<endl;

// 3. 指针t1的值赋值给了t2,两个指针指向的地址相同,都是t1的地址
t2 = t1;
cout << "&t1:" << t1 << " a = " << t1->a << endl;
cout << "&t2:" << t2 << " a = " << t2->a <<endl;

t1->a = 111;
t2->a = 222;
// 4. 修改了同样的地方,输出为222
cout << "&t1:" << t1 << " a = " << t1->a << endl;
cout << "&t2:" << t2 << " a = " << t2->a <<endl;
}

类对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void test2() {
// 1. 两个类对象
Test t1;
t1.a = 10;
Test t2;
t2.a = 5;

// 2. 对象的内容不一样
cout << "&t1:" << &t1 << " a = " << t1.a << endl;
cout << "&t2:" << &t2 << " a = " << t2.a <<endl;

// 3. 把t1对象的内容赋值给t2。t2的内容和t1相同
t2 = t1;
cout << "&t1:" << &t1 << " a = " << t1.a << endl;
cout << "&t2:" << &t2 << " a = " << t2.a <<endl;

// 4. 再分别修改两个不同的对象,输出分别为111, 222
t1.a = 111;
t2.a = 222;
cout << "&t1:" << &t1 << " a = " << t1.a << endl;
cout << "&t2:" << &t2 << " a = " << t2.a <<endl;

}

不同点

类指针 类对象
内存分配 定义类指针,不分配内存 定义类对象,分配内存
关系 内存地址,指向类对象。利用构造函数分配一块内存
访问 间接访问 直接访问
多态 实现多态,父类指针调用子类对象 不能实现多态,声明即调用构造函数,已分配内存
堆栈 内存堆,永久变量,手动释放,new-delete搭配 内存栈,局部临时变量
new的对象在堆中 在栈中
使用 new: S* s = new S() , s->name 声明即可: S s;s.name
生命期 需要delete 类的析构函数来释放空间
传参 指针4个字节 对象,参数传递资源占用太大
虚函数f 调用分配给它空间时那种类的func 调用自己的func
其它 父类指针指向子类对象

推荐使用const &引用,安全系数高。