为什么c++中返回成员变量的指针,会破坏了封装?

上述代码中,get()函数返回的是类成员变量的name的地址,这是很危险的,name是私有的,意味这不想被客户访问,但是如果返回name的地址,那么外部函数就可以修改name,这就破坏了封装性。

为什么会出现上述破坏封装的情况呢?
我们知道在面向对象语言里面有一个概念,叫做访问说明符(access specifier),其实就是public private protected三个访问说明符。虽然说访问说明符是结构的一部分,他们不影响从这个结构创建的对象,但是访问说明符在程序开始运行之前,所有的访问说明信息都消失了,访问说明信息通常是在编译期间消失的。在程序运行期间,对象变成了一个存储区域,因此如果真有人想要破坏这些规则并且直接访问内存中的数据,就如在c中所做的那样,那么c++并不能防止他做这种不明智的事。
为什么c++中返回成员变量的指针,会破坏了封装?的更多相关文章
- 从汇编看c++中指向成员变量的指针(二)
		在从汇编看c++中指向成员变量的指针(一)中讨论的情形没有虚拟继承,下面来看看,当加入了虚拟继承的时候,指向成员变量的指针有什么变化. 下面是c++源码: #include <iostream& ... 
- 从汇编看c++中指向成员变量的指针(一)
		在c++中,指向类成员变量的指针存储的并不是该成员变量所在内存的地址,而仅仅是该成员变量在该类对象中相对于对象首地址的偏移量.因此,它必须绑定到某一个对象或者对象指针上面,这里的对象和对象指针,就相当 ... 
- 继承的基本概念:  (1)Java不支持多继承,也就是说子类至多只能有一个父类。  (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。  分析以上程
		继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ... 
- Java接口中的成员变量默认为(public、static、final)、方法为(public、abstract)
		interface”(接口)可将其想象为一个“纯”抽象类.它允许创建者规定一个类的基本形式:方法名.自变量列表以及返回类型,但不实现方法主体.接口也可包含基本数据类型的数据成员,但它们都默认为publ ... 
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效
		这是在面试中遇到的一个问题,没有答出来,后来上网上查了一些资料,终于弄明白了: 一.首先c++标准规定成员变量必须在调用构造函数前进行初始化(这一点很重要) 二.如果我们在构造函数中对成员变量进行初始 ... 
- Java学习笔记十五:Java中的成员变量和局部变量
		Java中的成员变量和局部变量 一:成员变量: 成员变量在类中定义,用来描述对象将要有什么 成员变量可以被本类的方法使用,也可以被其他类的方法使用,成员变量的作用域在整个类内部都是可见的 二:局部变量 ... 
- Java接口中的成员变量为什么必须声明为public static final?
		我想对于每个Java程序员来说,接口都不陌生,接口中的方法也经常使用.而接口中的成员变量,就显得用得少一点,而对于成员变量为什么必须声明为public static final,可能就更不清楚了,而且 ... 
- java中的成员变量、类变量,成员方法、类方法   属性和方法区别
		成员变量:包括实例变量和类变量,用static修饰的是类变量,不用static修饰的是实例变量,所有类的成员变量可以通过this来引用. 类变量:静态域,静态字段,或叫静态变量,它属于该类所有实例共有 ... 
- Android中的成员变量与局部变量
		简单说一下吧, note:java中的成员变量就是c++中的全局变量 1.可以在全局范围内使用:局部变量只能在其定义的方法里使用. 2.成员变量可以不赋初值使用,调用时有系统的默认的初值,比如int类 ... 
随机推荐
- windows安装python运行环境使用pycharm
			pycharm下载地址: https://www.jetbrains.com/zh/pycharm/download/download-thanks.html 安装教程: https://blog.c ... 
- PHP中间件--ICE
			ICE(Internet Communications Engine)是Zeroc提供的一款高性能的中间件.使用ICE能使得php(或c++,java,python)与java,c++,.net,py ... 
- cookie和session的比较
			cookie和session的比较 一.对于cookie: ①cookie是创建于服务器端 ②cookie保存在浏览器端 ③cookie的生命周期可以通过cookie.setMaxAge(2000); ... 
- Dictionary 字典的使用
			Dim a, d, i '创建几个变量Set d = CreateObject("Scripting.Dictionary")d.Add "a&q ... 
- UI5-文档-4.32-Routing with Parameters
			现在我们可以在overview和detail页面之间导航,但是我们在overview中选择的实际项目还没有显示在detail页面上.我们的应用程序的一个典型用例是在详细信息页面上显示所选项目的附加信息 ... 
- svn更新代码时控制台出现的英文字母表示什么意思
			U:表示从服务器收到文件更新了 G:表示本地文件以及服务器文件都已经更新,而且成功的合并了 A:表示有文件或者目录添加到工作目录 R:表示文件或者目录被替换了 C:表示文件的本地修改和服务器修改发生冲 ... 
- C++连接Oracle之OCCI(windows)
			上一节我们讲过了ADO连接Oracle,这一节我们尝试通过OCCI的方式,来在windows平台下连接Oracle数据库,下一节讨论在Linux环境下通过OCCI的方式连接远程的Oracle数据库. ... 
- 【完结汇总】iKcamp出品基于Koa2搭建Node.js实战共十一堂课(含视频)
- IOS6新特性之下拉刷新<UIRefreshControl>
			在IOS6未发布之前,几乎都是使用那个UIRefresh在实现下拉刷新,甚至有人还是先了上拉的功能,不得不说牛人很多啊.可能是Apple意识到了这个功能的实用性,在IOS6中增加了下拉刷新,但是上啦还 ... 
- 在SQL Server中使用CLR调用.NET方法
			介绍 我们一起来做个示例,在.NET中新建一个类,并在这个类里新建一个方法,然后在SQL Server中调用这个方法.按照微软所述,通过宿主 Microsoft .NET Framework 2 ... 
