好奇这个,所以参考了一些帖子,写下心得。


一篇转载率较高的帖子:C++ 类对象和 指针的区别

大佬都不贴结果。。。。所以这里我给出代码和结果:

#include<iostream>
using namespace std;class Test{
public:int a;Test(){a = 1;}
};int main()
{Test* t1 = new Test();t1->a = 10;Test* t2 = new Test();t2->a = 5;cout << "&t1:" << t1 << " a = " << t1->a << endl;cout << "&t2:" << t2 <<  " a = " << t2->a <<endl;cout << "------------------------------" << endl;t2 = t1;cout << "&t1:" << t1 << " a = " << t1->a << endl;cout << "&t2:" << t2 <<  " a = " << t2->a <<endl;cout << "------------------------------" << endl;t1->a = 111;t2->a = 222;cout << "&t1:" << t1 << " a = " << t1->a << endl;cout << "&t2:" << t2 <<  " a = " << t2->a <<endl;return 0;
}

结果:

说明类指针和变量指针一样,指针赋值以后改动的就是地址了

#include <iostream>
using namespace std;
class Test{
public:int a;Test(){a = 1;}
};
int main()
{Test t1;t1.a = 10;Test t2;t2.a = 5;cout << "&t1:" << &t1 << " a = " << t1.a << endl;cout << "&t2:" << &t2 <<  " a = " << t2.a <<endl;cout << "------------------------------" << endl;t2 = t1;cout << "&t1:" << &t1 << " a = " << t1.a << endl;cout << "&t2:" << &t2 <<  " a = " << t2.a <<endl;cout << "------------------------------" << endl;t1.a = 111;t2.a = 222;cout << "&t1:" << &t1 << " a = " << t1.a << endl;cout << "&t2:" << &t2 <<  " a = " << t2.a <<endl;return 0;
}

说明类对象和c++中的普通变量一样,赋值就是对值进行改动,对地址没有改动


类的指针:他是一个内存地址值,他指向内存中存放的类对象(包括一些成员变量所赋的值).   
对象:他是利用类的构造函数在内存中分配一块内存(包括一些成员变量所赋的值).

指针变量是间接访问,但可实现多态(通过父类指针可调用子类对象),并且没有调用构造函数。 
直接声明可直接访问,但不能实现多态,声明即调用了构造函数(已分配了内存)。

类的对象:用的是内存栈,是个局部的临时变量.   
类的指针:用的是内存堆,是个永久变量,除非你释放它.

在应用时:   
        1.引用成员:   对象用"   .   "操作符;   指针用"   ->   "操作符.   
        2.生命期:     若是成员变量,则是类的析构函数来释放空间;若是函数中的临时变量,则作用域是该函数体内.而指针,则需利用delete   在相应的地方释放分配的内存块.   
        注意:用new   ,一定要delete..

看来类指针也是需要delete的?

C++的精髓之一就是多态性,只有指针或者引用可以达到多态对象不行
类指针的优点: 
第一实现多态。 
第二,在函数调用,传指针参数。不管你的对象或结构参数多么庞大,你用指针,传过去的就是4个字节。如果用对象,参数传递占用的资源就太大了


趁热打铁再来一个博客:解析C++普通局部变量与指针类型的对象变量的应用区别

首先我们先来了解一下MFC中的CPtrArray类,他可以说是CObject类型指针对象的集合。通过int Add(CObject* newElement );注意参数是一个指针类型)可以向集合中添加元素。首先我们定义一个CPtrArray类型的对象。

CPtrArray pArray;//他是一个全局对象

先设定一个举例的类类型。如:

class A
{
public:A(int i){a = i;}~A(){}
public:int a;
};

现在我们需要在某个函数中要实现将一个A类型对象数据加入到一个CPtrArray对象中。此函数func1()如下:

void func1()
{//首先定义一个A类型的对象A a(1);//使用pArray对象中的成员函数将此对象加入到容器中pArray.Add(&a);
}

另一个函数中我们使用pArray容器为我们保存的数据:

void func2()
{//首先声明一个A类型的对象A* a;//使用pArray对象中的成员函数GetAt()将A类型的对象取出for(int i; i < pArray.GetSize();i++){a = (A*)pArray.GetAt(i);//使用A中的数据进行相关的操作代码。***此时也可以使用delete释放指针指向的内存区块,防止内存泄露***当然是后面一种方法时才用到,暂时无视之。...}}

现在我们发现按照上面的过程,当我们在func2()函数中将要使用pArray容器对象为我们保存的数据时,我们并不能得到想要的数据!!!为什么发生以上情况?图解如下

pArray保存a保存资源的地址;

func1函数执行完成,a发生析构,资源不可用;

原来在func1()函数中,a对象是一个局部对象,当我们使用pArray.Add(&a);我们将a对象的地址保存到pArray对象中。但是作为局部对象,当func1

执行完成后,资源需要回收,此时我们定义的a对象也在A类中的析构函数中被析构释放资源!而当我们在fun2()函数中执行取出保存的对象时,

实际是根据保存的地址去内存中找到数据,虽然此时我们能能够找到此地址,但是这个地址上面的数据并不是我们需要的了!!!所以才发生面的情况!

那么怎么才能解决呢?

看下面,我们只需更改func1函数中的代码:

void func1()
{//首先定义一个A类型的对象//A a(1);//为对比,只是注释原来那句A* a = new A(1);//使用pArray对象中的成员函数将此对象加入到容器中pArray.Add(a);
}

这样,我们就能够在func2函数中使用pArray对象中包含的数据了!那么为什么定义了一个指针类型的对象就能够完成了呢?还是一个局部对象呀,

前面说的func1函数执行完成后此对象还是要经历析构的啊!图解如下:

pArray中保存a指向资源的地址;

func1函数执行完成,a对象发生析构,pArray根据地址还能能够访问到之前的资源;

对,是要析构,但是,我们在pArray.Add(a);中加入的是a对象资源的地址,我们先看看A* a = new A(1);在堆中分配资源,我们知道,在堆中分配的资

源是在跟程序的生命周期是一致的。a对象虽然析构了(不存在了),因为a也是一个指针,a指针也就是保存这个资源的地址!我们在pArray中保存的a的地址出的资源并没有析构!所以在func2函数中我们还能够使用此地址访问此地址对应的资源!

--------------------------------END---------------------------

C++类对象和类指针的区别相关推荐

  1. 22.类对象和类指针

    Student a; s.setName("A");//Studeng *b = new Student();Student *b;b = new Student();b-> ...

  2. 类对象和类指针深入分析与对比

    1.前言 Student a; s.setName("A");//Studeng *b = new Student(); Student *b; b = new Student() ...

  3. new创建类对象与直接定义的区别

    <div class="markdown_views"><h1 id="new创建类对象与直接定义的区别">new创建类对象与直接定义的 ...

  4. 看完这篇你还敢说分不清 Java 类 对象 实例 变量间的区别?

    看完这篇你还敢说分不清 Java 类 对象 实例 变量间的区别? 什么是类? 什么是对象? 什么是变量? 对象和类的关系: Java中的类: Java中的对象 Java中的变量 Java 中调用 对象 ...

  5. 初始化列表||类对象作为类成员|| 静态成员

    初始化列表 作用: C++提供了初始化列表语法,用来初始化属性 语法:构造函数():属性1(值1),属性2(值2)... {} #include <iostream> using name ...

  6. C++ 类对象作为类成员

    C++ 类对象作为类成员 对象成员:C++类中的成员可以是另一个类的对象 示例 对象成员:C++类中的成员可以是另一个类的对象 例如: class A {} class B {A a: } B类中有对 ...

  7. C++类对象作为类成员

    C++类中的成员可以是另一个类的对象,我们称该成员为对象成员 代码如下: #include <iostream> using namespace std; #include <cst ...

  8. 【转载】c++之类的基本操作(c++ primer 的读书笔记 ,类对象, 类用户, 类成员的含义)

    一前言 看c++ primer有一个地方看的云里雾里的,这么一段话 可以认为 protected 访问标号是 private 和 public 的混合: • 像 private 成员一样,protec ...

  9. c/c++教程 - 2.4.2.7~8 类对象作为类成员,static静态成员变量函数

    目录 4.2.7 类对象作为类成员 4.2.8 静态成员 相关教程 4.2.7 类对象作为类成员 C++类中的成员可以是另一个类的对象,我们称该成员为 对象成员. 例如: class A {} cla ...

最新文章

  1. poj1274(二分图匹配)
  2. 人类快感程度体验等级
  3. linux下配置iscsi存储,linux 下iscsi网络存储配置
  4. POJ 1830.开关问题(高斯消元)
  5. 查看Oracle的redo日志切换频率
  6. html无序列表只能横着排吗,[三地连线走势图]css 怎样让无序列表 横着排列
  7. python画图代码大全-Python Matplotlib 绘图使用指南 (附代码)
  8. oracle客户端 PLSQL安装配置教程
  9. 让xcode5能使用ios6.1模拟器
  10. Git和SVN的区别(以后别再问我了)
  11. leetcode 5724. 绝对差值和
  12. 针对豆瓣TOP250电影知识图谱的构建(Python+neo4j)
  13. ecshop2.7.3 支付宝alipay官方电脑手机H5新版支付接口支持异步回调
  14. 龙门架式焊接机器人_一种龙门架式焊接机械手的制作方法
  15. 用python写家族树的基本事实
  16. 程序员武器之键盘,适用于其他文字录入者
  17. CTF之代码审计汇总
  18. 重装linux后没声音,笔记本电脑安装ubuntu系统后外放没有声音 ,耳机正常,三步解决办法...
  19. 2017-3-18号巽寮湾游记
  20. 樱花未开(更新完毕)

热门文章

  1. Atlassian Confluence OGNL表达式注入代码执行漏洞(CVE-2021-26084)
  2. 京剧“ 韵味” 及其它
  3. 计算机专业考英语1,计算机专业英语(第1次考试).doc
  4. JAVA入门基础进阶(十四)—— 实现多线程、线程同步、生产者消费者
  5. matlab trapz求二重积分,matlab求积分(超详细,含int integral integral2/3 quad trapz
  6. Android开发两年,跳槽面试小公司面试官说我可以试试大厂
  7. CATIA一些技巧----------转自水木清华
  8. mysql 自定义函数 递归查找父节点
  9. springmvc整合mybatis框架源码 bootstrap html5 mysql oracle
  10. 蓝桥杯Python—闰年判断