c++访问私有成员变量和私有成员函数的常用方法

2023-10-26

类的对象不能直接访问类声明的私有成员变量,否则破坏了信息隐藏的目的。
在C++中,为了防止某些数据成员或成员函数从外部被直接访问,可以将它们声明为private,这样编译器会阻止任何来自外部非友元的直接访问。

1.私有成员变量的四种访问方法

(1)通过公共函数为私有成员赋值

#include <iostream>  
using namespace std;  
 
class Test  
{  
private:  
	int x, y;  
public:  
	void setX(int a)  
	{  
		x=a;  
	}  
	void setY(int b)  
	{  
		y=b;  
	}  
	void print(void)  
	{  
		cout<<"x="<<x<<'\t'<<"y="<<y<<endl;  
	}  
} ; 
 
int main()  
{  
	Test p1;  
	p1.setX(1);  
	p1.setY(9);  
	p1.print( );  
	return 0;  
}  

(2)利用函数访问私有数据成员

#include <iostream>  
using namespace std;  
class Test  
{  
private:  
	int x,y;  
public:  
	void setX(int a)  
	{  
		x=a;  
	}  
	void setY(int b)  
	{  
		y=b;  
	}  
	int getX(void)  
	{  
		return x;   //返回x值  
	}  
	int getY(void)  
	{  
		return y;   //返回y值  
	}  
};  
int main()  
{  
	Test p1;  
	p1.setX(1);  
	p1.setY(9);  
	int a,b;  
	a=p1.getX( );  
	b=p1.getY();  
	cout<<a<<'\t'<<b<<endl;  
	return 0;  
}     

(3)利用引用访问私有数据成员

#include <iostream>  
using namespace std;  
class Test  
{  
private:  
	int x,y;  
public:  
	void setX(int a)  
	{  
		x=a;  
	}  
	void setY(int b)  
	{  
		y=b;  
	}  
	void getXY(int &px, int &py) //引用  
	{  
		px=x;    //提取x,y值  
		py=y;  
	}  
};  
int main()  
{  
	Test p1,p2;  
	p1.setX(1);  
	p1.setY(9);  
	int a,b;  
	p1.getXY(a, b); //将 a=x, b=y  
	cout<<a<<'\t'<<b<<endl;  
	return 0;  
}  

(4)利用指针访问私有数据成员

#include <iostream>  
using namespace std;  
class Test  
{  
private:  
	int x,y;  
public:  
	void setX(int a)  
	{  
		x=a;  
	}  
	void setY(int b)  
	{  
		y=b;  
	}  
	void getXY(int *px, int *py)  
	{  
		*px=x;    //提取x,y值  
		*py=y;  
	}  
};  
int main()  
{  
	Test p1;  
	p1.setX(1);  
	p1.setY(9);  
	int a,b;  
	p1.getXY(&a,&b);  //将 a=x, b=y  
	cout<<a<<'\t'<<b<<endl;  
	return 0;  
}  

详见 https://blog.csdn.net/KgdYsg/article/details/82492797?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159922886019724839809393%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=159922886019724839809393&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v3~pc_rank_v3-2-82492797.pc_ecpm_v3_pc_rank_v3&utm_term=c%2B%2B%E8%AE%BF%E9%97%AE%E7%A7%81%E6%9C%89private%E6%88%90%E5%91%98%E5%8F%98%E9%87%8F%E7%9A%84%E5%B8%B8%E7%94%A8%E6%96%B9%E6%B3%95&spm=1018.2118.3001.4187

2.在类外调用类的私有成员函数的两种方法

(1).通过类的public成员函数调用private成员函数

 
#include<iostream>
using namespace std;
class Test
{
    public:
        void fun2()
        {
            fun1();
        }
    private:
        void fun1()
        {
            cout<<"fun1"<<endl;
        }
};
int main()
{
    Test t;
    t.fun2();
    return 0;
}

(2).通过类的友元函数调用该类的private成员函数,但是该成员函数必须设为static,这样就可以在友元函数内通过类名调用,否则无法调用

 
#include<iostream>
using namespace std;
class Test
{
    friend void fun2(); //fun2()设为类Test的友元函数
 private:
     static void fun1()
     {
         cout<<"fun1"<<endl;
     }
};
void fun2()
{
    Test::fun1();
}
int main()
{
    fun2();
    return 0;
}

详见 https://blog.csdn.net/jackchoise030/article/details/86158780

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++访问私有成员变量和私有成员函数的常用方法 的相关文章

  • 根据当前文化调用不同(本地化)视图

    我在用着LocalizationAttribute它实现了ActionFilterAttribute本地化视图 我简单地说 Localize 在控制器上 我使用 LocalizeStrings resx 文件根据当前线程上的语言进行应用 一
  • 您使用什么工具和技术来查找死代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪些工具和技术来查找 NET 中的死代码 过去 我用 Obsolete 属性修饰方法 传递 tr
  • OWIN AuthenticationOptions 在 mvc5 应用程序中运行时更新

    Hi 情况如下 我在 iis 7 上有一个带有 Identity 2 的 MVC 5 应用程序 该应用程序为多个网站提供服务 主机名是某些网站的关键 网站 另一个网站 等等 我决定在我的所有网站上使用谷歌外部登录 每个网站都应该是带有个人
  • 以编程方式更改 Excel 中的字体(Trebuchet MS、Calibari)C#

    我目前正在使用一个 C 应用程序 该应用程序有一个将生成 Excel 文件的类 一切都很顺利 Excel 工作表上填充的数据具有 Times New Roman 字体 我想将其更改为其他字体 Calibari 我怎样才能以编程方式做到这一点
  • 如何将 CroppedBitmap 转换为 BitmapImage

    我正在尝试将 CroppedBitmap 转换为 BitmapImage 编辑 不使用内存流 我尝试过直接转换它 似乎这不是一个选择 这应该没那么难 我正在尝试剪切 BitmapImage 的一部分 并创建一个仅包含新裁剪的 Bitmap
  • 外部剃刀视图看不到外部模型

    我对外部剃刀视图有疑问 在我的项目中 我有主 mvc Web 程序集和动态加载的外部类库程序集 来自 DB 及其自己的控制器 视图和模型 这些程序集在运行时不会直接引用和加载 我能够通过为控制器创建自定义控制器工厂 为视图创建自定义虚拟路径
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • ObjectTrackingEnabled 和 linq-to-sql

    I read here http www sidarok com web blog content 2008 05 02 10 tips to improve your linq to sql application performance
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • 测试从 ComboBox 派生的自定义控件

    我创建了一个从 ComboBox 派生的控件 并希望对其行为进行单元测试 但是 它在我的单元测试中的行为似乎与实际应用程序中的行为不同 在实际应用程序中 Combobox DataSource 属性和 Items 同步 换句话说 当我更改
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 没有类型的 IEnumerable 属性

    我正在尝试创建一个类似于来自 MSDN 的官方 DataGrid ItemsSource 的属性 public IEnumerable ItemsSource get set 这提供了对任何派生类中任何类型的支持 有了这个 我可以设置类似的
  • Subsonic 3 ActiveRecord 嵌套选择导致 NotIn 错误?

    我有以下 Subsonic 3 0 查询 其中包含嵌套的 NotIn 查询 public List
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On
  • 更快的 WinSock sendto()

    我使用的是 Windows Server 2008 我的程序是用 C 编写的 我在 while true 循环中使用 WinSock2 和 sendto 来发送数据包 代码如下 while true if c snd gt max c sn
  • 如何以一对一/零关系更新员工和身份用户

    我正在尝试更新员工记录 也想更新身份用户 如果我先单独更新身份用户 例如 UserManager Update user Context Entry employee State System Data Entity EntityState

随机推荐

  • 查看服务器当前内存cpu信息,查看服务器当前内存cpu信息

    查看服务器当前内存cpu信息 内容精选 换一换 查询系统当前可监控指标列表 可以指定指标命名空间 指标名称 维度 排序方式 起始记录和最大记录条数过滤查询结果 GET V1 0 project id metrics参数说明参数说明名称是否必
  • 阿里云机器学习PAI全新推出特征平台,助力AI建模场景特征数据高效利用

    推荐算法与系统在全球范围内已得到广泛应用 为用户提供了更个性化和智能化的产品推荐体验 在推荐系统领域 AI建模中特征数据的复用 一致性等问题严重影响了建模效率 阿里云机器学习平台 PAI 推出特征平台 PAI FeatureStore 在所
  • Java垃圾回收器的选择与配置

    一 垃圾回收器介绍 垃圾回收器 优点 缺点 针对 特性 常见组合方式 Serial 简单高效 单线程导致停顿较长 新生代 单线程 使用标记 复制算法 适合客户端模式 Serial 新生代 Serial Old 老年代 ParNew 多线程
  • 测试游戏帧率电脑温度的软件,游戏中显示帧数和温度方法_游戏画面中实时显示FPS帧数温度技巧...

    相信很多游戏玩家平时都是在用电脑玩游戏 而且大家也喜欢看一看自己在在游戏画面中实时的FPS帧数和温度信息 但是很网友对这个游戏画面中如何实时显示FPS帧数 频率 硬件温度不太清楚 下面智能手机网分享一下具体的操作方法 以便大家在玩游戏的时候
  • 内网渗透-windows信息收集(实战命令与工具)

    文章目录 一 前言 二 Windows信息收集 一 CMD 本机信息收集 二 CMD 域信息收集 三 Powershell命令信息收集 3 1 知识补齐 Get CimInstance 与 Get WmiObject区别 四 导出域信息 低
  • Matlab常见报错:错误使用 conv2不支持 N 维数组;cell类型数组不支持运算符

    一 错误使用 conv2不支持 N 维数组 错误样例 原因 提示错误使用 conv2不支持 N 维数组 可能是因为你读取的图像并不是灰度图像 而是RGB图像 有red green blue三种颜色通道也就是说是三维的矩阵 所以我们需要将图像
  • Java day04 运算符 隐式转换 补码反码 --判断和循环 day05--循环高级和数组 random

    运算符 01 算术运算符的基本用法 运算符 02 除法和取模 运算符 03 算术运算符 数值拆分 1 导包 找到Scanner这个类在哪 书写注意 写在类定义上面 import java util Scanner public class
  • 再次用construct 2制作游戏

    有了上一次用construct 2制作游戏的经验 这次的制作过程明显比上次简单了许多 我决定尝试一下新的游戏类型 希望能有新的突破 这一次 我制作的是类似雷电的飞机射击游戏 第一步 先选好背景 第二步 添加各种objects 第三步 设置航
  • 编程每日一题_C程序设计_年份闰年/平年判断

    描述 输入年份 判断该年份是平年还是闰年 普通闰年 年份数值为4的倍数 且不是100的倍数 世纪闰年 公历年份是整百数 且是400的倍数 正确解法一 嵌套判断 满足条件即输出判断结果 include
  • SQL注入时order by 后面加数字的作用

    此文章是记录本人对知识理解的随手笔记 内容不肯定百分百正确 如有错误望指出并谅解 结论 order by 后面加数字可以判断服务器在查询某个表时所查询的列数 原理 1 当sql查询语句为 select username password u
  • Ruby 2.1 GC策略

    对象管理主要涉及 Profiling support 增加了hook用于状态获取 专用API 分代式GC引入
  • c++将模板实现放在cpp,外部使用模板的方法(demo,gcc+msvc(动态库))

    参考https blog csdn net mincheat article details 77987740 一般情况 模板函数被外部其他引用会提示找不到函数 原因是 编译本身这个cpp的时候 没有发现有引用的地方 那么就不会被编译 而编
  • 使用QEMU+GDB调试Linux驱动程序

    前提 QEMU中已经添加了设备支持 能够正常insmod rmmod xxx ko 然后才能有接下来的调试 step1 打开如下编译选项然后编译Linux内核 CONFIG DEBUG INFO y CONFIG RANDOMIZE MEM
  • 毕业设计 - STM32公交站牌系统

    文章目录 1 简介 2 主要器件 2 1 ILI9320 2 2 串口GPRS模块 2 3 相关传感器 3 实现效果 4 设计原理 5 部分实现代码 6 最后 1 简介 Hi 大家好 学长今天向大家介绍一个单片机项目 STM32公交站牌系统
  • 简易agv小车自动导航控制协议

    1 获取地图栅格 2 实体化 转换 3 行走指令 调度优先处理 1 比如 前面 10 100米 行走指令序列 2 以 后面 0 10分钟 行走指令序列 4 处理栅格 5 转换计算成行走操作 1 速度 2 绝对移动位置 3 错误操作 4 阻碍
  • ubuntu的APT介绍

    介绍 apt是一款安装包管理工具 在ubuntu下可以使用apt命令进行软件包的安装 删除 清理等 ubuntu软件操作的相关命令 sudo apt get update 更新源 sudo apt get install package 安
  • 对AI未来和人类关系的一点思考!

    人 由大脑和身体组成 大脑里存在着人类的意识 身体给大脑提供能量 而这能量是由外界的食物提供的 从而 人体加工食物转化成能量 大脑加工能量 转化成意识 而意识表现在计算能力和创新能力两个方面 计算能力是量变的积累 创新能力是质变的飞跃 创新
  • OSPF实验

    我们坠落 破碎 掉入深渊 但我们终会被托起 被治愈 我们无所畏惧 OSPF部分实验 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 没关系的 大家都会做错选择 会莫名其妙掉眼泪 走在路上会突然崩溃 但这并不影响我们去看
  • 栈越界攻击分析

    1 栈帧简介 之前几期学习分享了关于栈帧系列知识的学习 我们知道函数调用过程中 每一个调用函数都是以栈帧为单位 在其内存空间上做相关操作 每一个调用函数的栈帧存有其返回地址 调用函数结束后 根据返回地址回到上层栈帧空间 直至main 函数的
  • c++访问私有成员变量和私有成员函数的常用方法

    类的对象不能直接访问类声明的私有成员变量 否则破坏了信息隐藏的目的 在C 中 为了防止某些数据成员或成员函数从外部被直接访问 可以将它们声明为private 这样编译器会阻止任何来自外部非友元的直接访问 1 私有成员变量的四种访问方法 1