C++类对象和类指针的区别

article/2025/9/20 22:24:56

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


一篇转载率较高的帖子: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---------------------------

 

 

 

 


http://chatgpt.dhexx.cn/article/unI314TN.shtml

相关文章

Java中类和对象的区别

一、类和对象 1、类 类的理解 类是对现实生活中一类具有共同属性和行为的事物的抽象类是对象的数据类型&#xff0c;类是具有相同属性和行为的一组对象的集合简单理解&#xff1a;类就是对现实事物的一种描述 类的组成 属性&#xff1a;指事物的特征&#xff0c;例如&#xff…

安装svn 汉化包 也不能设置中文

(以下为亲测!) 汉化包地址:https://osdn.net/projects/tortoisesvn/storage 进入地址之后:选择对应版本-->>Language Packs-->>选择中文包 问题: 已经安装svn汉化包,但是不能设置为中文. 解决: 确保汉化包版本对应svn版本.如果汉化包版本已经对应svn版本,则把…

SVN汉化失败的原因及解决方案(通过SVN官网下载SVN和相应的汉化包)

1、没删除SVN根目录语言包里的所有文件 2、汉化包没放在SVN根目录的语言文件夹下安装 3、SVN版本和汉化包版本不一致 首先看自己电脑上安装的svn是什么版本&#xff1a; 比如我的就是 TortoiseSVN 1.11.1&#xff0c;那我就要找TortoiseSVN 1.11.1对应的TortoiseSVN 1.11.1l…

Tortoise SVN 汉化(官网下载汉化包)

&#xff08;本操作是已经下载Tortoise SVN后 &#xff0c;通过官网下载汉化包进行的操作&#xff09; 1、首先进入到官网 https://tortoisesvn.net/downloads.html 2、进入到官网首页&#xff0c;点击Translations 3、进入到翻译页面&#xff0c;点击download 4、进入到下…

window eclipse快速导入svn项目以及软件汉化

刚入职新公司&#xff0c;之前几家公司使用得IDE跟代码管理是idea跟gitlab,公司内sap/erp系统&#xff0c;立项时间较早&#xff0c;使用得是eclipsesvn。 进行导入项目之前&#xff0c;英语水平较差得得同学&#xff0c;可以将软件先进行快速汉化 1、如图 2、在弹出得输入框中…

关于svn汉化包安装无效的解决办法

下载svn汉化包要和对应的svn客户端版本对应&#xff0c;否则安装无效&#xff0c; 在安装前要想将svn安装目录下的languages目录下的文件全部删除 还有一点要注意的是 汉化包安装要放在svn安装目录下进行安装&#xff0c;它才能正常汉化 安装完后就可以选择语言了

SVN安装包汉化VS插件

一.SVN客户端安装 首先下载SVN 地址&#xff1a;https://tortoisesvn.net/downloads.zh.html 根据版本进行选择 安装直接下一步下一步默认文件夹就好了 安装完成右键就会有二个多出来的菜单 都是英文不是很方便 二.语言转换 在下载SVN的下面就有语言包可以一起下载 进行语…

svn汉化插件安装步骤

1.svn安装好之后&#xff0c;查看svn安装的版本&#xff0c;比如我的svn是1.9.7.27907版本 64位的。 2.去svn官网&#xff1a;https://tortoisesvn.net/ 3.将网站显示中文版&#xff0c;便于查看&#xff1a; 4.点击“下载”&#xff1a; 5.看版本一致&#xff0c;往下拉&#…

SVN基本使用1

一、什么是SVN 代码管理工具 能记住每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复已删除的文件 二、跟Git比 SVN使用简单上手快支持中文(Git较为复杂不支持中文) 目录级权限控制(Git没有),企业级安全必备 可以单独子目录checkOut(Git只能将整个仓库),可以减少…

Svn下载及安装(附带汉化包安装)

1、访问Svn官方网站&#xff1a;https://tortoisesvn.net 2、找到需要下载的版本类型 3、下载完成后一直下一步安装即可 4、Svn安装包下载 5、下载完成之后&#xff0c;一直下一步即可 6、安装好之后&#xff0c;在任意空白位置 —> 右击 —> 选择TortoiseSVN —> …

Windows安装SVN客户端并汉化

1、下载 https://tortoisesvn.net/downloads.zh.html 2、安装 鼠标双击 3、汉化 汉化包下载地址&#xff1a;https://tortoisesvn.net/downloads.zh.html 鼠标双击汉化包 点击svn的各种界面查看是否汉化成功

SVN下载以及汉化安装包的使用

前言&#xff1a; SVN&#xff08;subversion&#xff09;是一个开放源代码的版本控制系统&#xff0c;通过采用分支管理系统的高效管理&#xff0c;实现资源的共享&#xff0c;实现集中式的管理。 SVN下载&#xff1a; 第一步&#xff1a; https://tortoisesvn.net/downloads…

SVN汉化以及简单的使用

一、SVN的安装以及汉化 1.下载SVN的安装包以及汉化包&#xff1b; 2.先安装SVN汉化包&#xff0c;然后安装SVN的程序软件&#xff0c;都安装完成后&#xff0c;在空白位置右击选择设置&#xff0c;在language中选择中文简体&#xff0c;点击确认即可&#xff1b; 至此&#xff…

安装svn和安装svn汉化语言包

svn官网&#xff1a; https://tortoisesvn.net/downloads.zh.html 这里下安装包 和语言包&#xff0c;以此安装即可&#xff1b;都默认安装就行了

解决SVN汉化不成功问题,下载历史版本

考虑是不是版本不一致问题。如果想汉化&#xff0c;最好在安装svn都下载了&#xff0c;直接安装。免得像我一样过了好久还得找对应版本安装≥﹏≤ 查看自己安装的svn历史版本 在官方网站找到对应的版本汉化包 点击版本连接找到对应版本–选择汉化包–找到中文点击下载&#…

SVN汉化包安装方法

注意&#xff1a;下载的svn汉化包必须与svn客户端版本对应&#xff0c;否则安装无效 1、首先安装svn客户端&#xff0c;然后将svn汉化包放在svn的安装目录下。 2、安装svn汉化包之前&#xff0c;将svn安装目录下的languages目录下的文件全部删除 。 3、svn汉化包安装完成后&am…

svn汉化失败解决方法

前提:别人已经安装好了svn,但是没有汉化,我随意找了一个汉化包,运行安装后,并没有汉化 成功过程: 1、找到一个文件,右击看到svn(已经安装了svn)&#xff0c;选中"关于"&#xff0c;看你到svn的版本&#xff0c;红框的就是我的版本 2、在svn官网上找到对应的汉化包&…

SVN 汉化语言

前言 小乌龟全是英文&#xff0c;有些东西总是找不到&#xff0c;给大家分享一下SVN小乌龟的汉化语言&#xff0c;轻松使用。 软件&#xff1a; SVN svn汉化包 步骤 汉化包下载&#xff1a; 百度搜索TortoiseSVN&#xff0c;进入官网&#xff0c;选择好安装的版本后&…

SVN安装及使用+SVN汉化

目录 第一步下载SVN及SVN汉化包 SVN下载&#xff1a; SVN汉化语言包下载网址&#xff1a; 第二步安装SVN及汉化包 使用说明检出项目 导入项目 关于项目的提交 更新&#xff1a; 解决冲突有三种选择&#xff1a; 如何降低冲突解决的复杂度&#xff1a; 查看日志 版本回滚…

SVN 汉化和安装

下载 官网下载地址&#xff1a; https://tortoisesvn.net/downloads.html 安装 打开下载的 TortoiseSVN 进行安装&#xff0c;本来将安装位置改成了 D 盘&#xff0c;如下图所示&#xff1a; 安装完成后进入目录 D:\Program Files\TortoiseSVN\Languages&#xff0c;将文件…