【C++】【一日一练】通过友元访问或改变类的私有成员【20140508】

题目来源:Beginners Lab Assignments Code Examples

Accessing Private Data Members in C++. This is a flaw in the language

/*
**Description: Accessing Private Data Members in C++
**Date:2014-05-08
**Author:xyq
*/
#include <iostream>
#include <string>
using namespace std;
class Person
{
private:
    string password;
public:
    string name;

    Person(string name, string password)
    {
        this->name = name;
        this->password = password;
    }  

    // 友元函数
    friend void OutputInfo(const Person &p);
    friend void SetPW(Person &p);
    // 友元类
    friend class Hacker;
};
// 在友元函数中访问类的私有成员
void OutputInfo(const Person &p)
{
    cout << "name: " << p.name << endl
         << "password: " << p.password << endl;
}
// 在友元函数中修改类的私有成员
void SetPW(Person &p)
{
    cout << "随便你想改成什么密码,输入吧~" << endl;
    string pw;
    cin >> pw;
    p.password = pw;
}
// Person的友元类定义
class Hacker
{
private:
    string name;
public:
    Hacker(string n):name(n){   };
    void modifyPW(Person &p);
};
// 通过友元类修改类的私有成员
void Hacker::modifyPW(Person &p)
{
    p.password = "你的密码被" + name + "改掉了,哈哈!";
}
int main(int argc, char *argv[])
{
    Person p("Adam", "1234567");
    OutputInfo(p);
    cout << endl;

    SetPW(p);
    OutputInfo(p);
    cout << endl;

    Hacker h("CC");
    h.modifyPW(p);
    OutputInfo(p);
    cout << endl;

    return 0;
}

运行结果:

【C++】【一日一练】通过友元访问或改变类的私有成员【20140508】

时间: 2024-11-09 09:59:07

【C++】【一日一练】通过友元访问或改变类的私有成员【20140508】的相关文章

MFC 一个类访问另一个类成员对象的成员变量值

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/35263857 MFC中一个类要访问另外一个类的的对象的成员变量值,这就需要获得原来那个类对象的指针,其实有好几种方法都可以实现. 比如维护一个单例模式.设置静态变量等等.我们这里举个列子,实现多个类之间的相互访问. 一.示例:创建MFC对话框,实现对个对话框之间数据访问 我们创建一个MFC对话框应用程序,命名为Visit工程. 对话框本身有一个主界面(CVisitDlg对话框

C#箴言之用属性来访问类的私有成员

在程序中,难免要访问某个对象的私有成员.那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从“private”改为“public”即可:而另一个就是提供公有的成员访问函数来进行访问.那么现在用C#编写程序,就不再需要采用前面所说的两种方法了,而直接使用属性来完成. 首先来看看三种方法的如何实现以及调用的,这里用一个例子来说明,即访问“EmployeeInfo”类的私有成员strName,具体如下表格所示. 那么这三种方法有什么区别呢,用如下的表格,可以更好的说明三者的区别. 因

第十六周oj刷题——Problem I: 改错题:类中私有成员的访问

Description 改错题: 设计一个日期类和时间类,并编写全局函数display用于显示日期和时间.要求:display函数作为类外的普通函数,而不是成员函数 在主函数中调用display函数,display函数分别引用Time和Date两个类的对象的私有数据,输出年.月.日和时.分.秒. Input 年      月       日 时      分       秒 Output 年/月/日 时:分:秒 Sample Input 2013 12 23 14 23 50 Sample Ou

c++中类对象不能访问类的私有成员变量

类的成员变量分三种: public   protect  private 1.类的成员函数可以访问类这三类 2.继承类成员函数可以访问 protect  类型 3.只有本身类的成员函数才可以访问 private 类型 4.类的对象若在其他函数中是不可以访问类的 protect  private类型变量 类其实是个模型.而对象就是找个这个模型制作的实体.比如,类是造车的图纸,对象就是找个图纸造出的汽车.类的成员是分级别的:protect,public,private.在类内部定义的函数可以访问任何

类的私有成员访问

方法一:定义接口函数 方法二:利用友元函数

MFC如何在CMainFrame类中访问CxxxView视图类中的成员

在视图类中,我们可以通过调用AfxGetMainWnd()函数得到框架窗口的指针. 注意,需要在view类实现部分添加#include "MainFrm.h". 1 CMainFrame* pMFram = (CMainFrame*)AfxGetMainWnd(); 如果想在框架窗口中想调用CxxxView类中的函数,也需要得到相应View视图类的指针. 但是需要注意,这里不仅得包含xxxView.h,还需要包含xxxDoc.h头文件, 还需要注意头文件的顺序,先包含Doc.h,再包含

(继承及其访问限定符)&&(派生类及其默认成员函数)&&(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

类的集成,对基类私有成员的访问

派生类不能直接访问基类的私有成员,若要访问必须使用基类的接口,即通过其成员函数.实现方法有如下两种: 1.在基类的声明中增加保护成员,将基类中提供给派生类访问的私有成员定义为保护成员.2.将需要访问基类私有成员的派生类成员函数声明为友元. #include<iostream> using namespace std; class Base {       friend class Derived2;//friend       int x;       protected://protecte

(继承及其访问限定符)&amp;&amp;(派生类及其默认成员函数)&amp;&amp;(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~