先贴代码:

#includeusing namespace std;
class CPoint
{public:CPoint(int xx, int yy){x = xx;y = yy;}CPoint(const CPoint &p){x = p.x;y = p.y;}
private:int x, y;
};

如果你在想为什么拷贝构造函数的参数可以直接去访问它自己的私有成员的话,你就需要好好的看完这篇文章。如果你没有在想,那么很好,这篇文章就随它去吧~

===============================================================================================================================

进入正文:

之所以会有上面的那个疑问,无疑的就是进入了一个认识误区——对象是不可以直接访问私有成员的。

但是这个真的是个超级大的误区。

我们先来看,私有,公有,受保护的,是针对什么东西来谈的:不是针对对象来说的,是针对于类来说的。是用来限定类外的东西访问类内的东西是有限制的。从来不是对对象而言的。


如果还不是很清楚上面的表述,我们举几个例子来看:

1.为什么类中的成员函数可以访问到私有的数据成员?

你可能认为它就是可以访问,没有为什么。不对,又为什么,就是因为它在类内。

2.为什么主函数中定义的对象不能访问它的私有成员?

你可能认为因为它是对象,对象是不能访问到私有成员的。不对,是因为它在类外,与对象不能访问一点关系都没有。


对象能否访问到私有成员与其定义的位置有关:在类内定义,可以访问,在类外定义,不能访问。

到这里我们也就理解了最开始贴的那个代码了~

再贴一个代码:

#includeusing namespace std;
#includeclass CPoint
{public:CPoint(int xx, int yy){x = xx;y = yy;}friend class distance;
private:int x, y;
};
class distance
{public:double point_to_oralpoint(CPoint p1){return sqrt(p1.x*p1.x + p1.y*p1.y);}
};

好啦,我们现在又发现了一个和上面说的貌似有点违背的东西:为什么在类外定义的函数竟然可以访问到上面类的私有成员?

因为:

在类CPoint里面声明了distance为它的朋友类,CPoint把distance当朋友(distance未必把CPoint当朋友哦~,所以CPoint并不能访问到distance的成员)。

CPoint把distance当朋友,distance可以通过他定义的函数中的参数表去访问到CPoint里面的私有成员,这个私有数据成员是对其公开的,就相当于是在distance的类中,但是要通过参数(CPoint的对象)去指明这是那个对象的数据成员而已。

而这个就是最普遍的需要被了解的类外如何访问类内的私有成员的知识点了。

关于对象不能直接访问私有成员的误区(转)相关推荐

  1. 为什么静态成员函数可以访问私有成员变量?(访问控制是针对类而不是针对对象)

    访问控制是针对类而不是针对对象 先看几个标准定义 A member of a class can be - private; that is, its name can be used only by ...

  2. C++ 笔记(16)— 类和对象(类定义、类实例对象定义、访问类成员、类成员函数、类 public/private/protected 成员、类对象引用和指针)

    1. 类的定义 类定义是以关键字 class 开头,后跟类的名称.并在它后面依次包含类名,一组放在 {} 内的成员属性和成员函数,以及结尾的分号. 类声明将类本身及其属性告诉编译器.类声明本身并不能改 ...

  3. C#中访问私有成员技巧

    源代码是别人的,你就不能修改源代码,只提供给你dll.或者你去维护别人的代码,源代码却有丢失.这样的情况如果你想知道私有成员的值,甚至去想直接调用类里面的私有方法.那怎么办呢?其实在.net中访问私有 ...

  4. C++ 单继承访问私有成员

    c++ 单继承之如何调用私有成员 #include <iostream> #include <string> using namespace std; class Person ...

  5. 关于对象的引用作为参数,可以直接访问私有成员的问题

    #include using namespace std; class CPoint { public:CPoint(int xx, int yy){x = xx;y = yy;}CPoint(con ...

  6. 学习笔记-----关于C++中类的成员函数可以访问私有成员的问题

    直接上代码吧 template<class T> class vectorList : public linearList<T> { public: vectorList(si ...

  7. 封装之--通过类中公有方法访问私有成员变量

    如何在ClassB中访问ClassA的私有成员变量?(典型的封装案例) 通过在ClassA中定义公有的成员方法,然后,在ClassB中通过ClassA的对象调用ClassA中的公有方法,来访问Clas ...

  8. 友元函数可以访问私有成员吗_C++的友元函数和友元类

    C++使用类对数据进行隐藏和封装,类的数据成员一般定义为私有成员,而将提供类与外界通讯接口的成员函数定义为公有的. C++类成员的三种访问权限: public:可以被该类中的函数.子类的函数.友元函数 ...

  9. 把类的成员函数声明为友元函数,但不能访问私有成员的原因和解决办法

    定义类X,类Y,在类X中声明类Y的成员函数g()为类X的友元函数 常见的几种错误写法及原因: 错误写法1 class Y; class X {public:X(int i) :i(i) {}frien ...

最新文章

  1. 飞行器的分类四轴飞行器实践教程大学霸
  2. php dedecms 记录访问者ip,dedecms实现显示访问者ip地址的办法
  3. c# u盘使用记录_C# 系统应用之通过注册表获取USB使用记录(一)
  4. 拳王虚拟项目公社:虚拟资源如何挣钱,小白月入过万的操作思路
  5. python unicode函数_python 中的unicode详解
  6. 补丁服务器 注册表,注册表补丁
  7. win10系统上玩纸牌游戏
  8. Mac如何清理缓存文件
  9. 百度世界大会全新打开方式!VR会场“希壤”上线
  10. 流水线中数据相关的理解(RAW、WAR和WAW)
  11. android串口开发!一年后斩获腾讯T3,附面试题答案
  12. 如何在众多快递物流中筛选出代收的单号
  13. UML软件工程--类图
  14. python课程设计 文字游戏 魔塔3
  15. 建行找不到服务器或DNS错误,Win7用浏览器上网总是弹出提示是否停止运行此脚本窗口...
  16. 25.Odoo产品分析 (三) – 人力资源板块(6) – 工资表(1)
  17. RK3228H开发之3328芯片手册简单分析
  18. 网吧台式计算机配置,详细推荐一套网吧电脑配置
  19. 修改Typora默认的字体为好看秀美的中文字体“华康手札体“并配置一些高级定制功能(20210404已成功测试)
  20. 中国象棋程序elephanteye(象眼) word软件下载

热门文章

  1. 王道考研 计算机网络8 物理层基本概念 数据通信相关术语
  2. 刹车八个技巧 教你踩得又稳又好
  3. 关于gcc扩展中的宏定义中用 # 和 ##
  4. 阿里云服务器 CentOS 7上-- Docker 安装 网关(API-Getway)--KONG
  5. Activiti工作流引擎的使用
  6. [转载]基于Aaf的数据拆分
  7. 字符流缓冲区的使用之BufferedWriter和BufferedReader
  8. 1)C++对象大小计算
  9. HTML之二:body标记的属性及属性值
  10. 如何保证MongoDB的安全性? 1