❶ C++友元函数访问类的私有数据
您好,看了代码理论上是可以的,然后在机子上编写了一个测试代码,就你上面提到的代码,我的测试时通过的没有遇到问题,代码如下:
/*--------------------------------------------------------------------------------
The test test.h
-----------------------------------------------------------------------------*/
#include<iostream>
using namespace std ;
class Test
{
private:
friend void setX(Test &, int) ;
friend ostream & operator<<(ostream &, Test &) ;
int x ;
public:
int getX() ;
} ;
void setX(Test &t, int iVal)
{
t.x = iVal ;
}
ostream & operator<<(ostream &output, Test &t)
{
output<<t.x<<endl ;
return output ;
}
int Test::getX()
{
return x ;
}
/*-----------------------------------------------------
Client.cpp
---------------------------------------------------*/
#include"test.h"
int main()
{
Test t ;
setX(t, 3) ;
cout<<t.getX() ;
cout<<t ;
getchar() ;
return 0 ;
}
测试下吧,可能跟你之前的代码有关吧。
❷ c++子类访问父类私有成员
一般好的项目,代码风格,设置成private的成员变量,不应该直接访问它的,最好为Circle::r写个成员函数,就可以间接访问了。比如
int Circle::Getr()
{
return r
}
另外,如果你非要不该父类的情况下访问,也是可以的,比如用类的成员指针,具体使用不好理解,风格不好。
❸ C 数据成员如何从公有改为私有
首先,相同类的不同对象可以访问彼此的私有数据,qht9624543 的回答是错的。
就语言语法定义来说,类的成员函数当然可以访问本类的所有私有数据。如果这个类声明了友元(friend)类或友元函数,那么这些友元类和函数也可以访问其私有数据。
你可以这么理解,一个类是自己的友元,相同类的对象之间是友元关系,所以相同类的对象之间也可以访问彼此的数据。
如果说深一点,为什么要有私有数据,是为了隐藏这个类的细节,让外部不了解这个类细节的代码不去乱用相关数据而导致高耦合。而相同类显然是了解自己的细节的,所以没必要去隐藏私有数据。友元则相当于由程序员指明了某个代码了解这个类的细节。
学C++慢慢来,面向对象这种东西要慢慢去悟,看到一个现状,想想它的本质是什么,为什么要这样,有一天你把它们的缘由都搞清楚的时候你对OOP的理解应该就差不多了,呵呵,加油吧。
❹ 在C++中怎么调用类中的私有成员函数
C++中调用类的私有成员函数的方法就是,在该类中再声明定义一个公有成员函数
在其函数内部调用自己的私有成员函数,向外使用的话,在别的类中包含该类的头文件,就可以通过公有函数隐式的访问私有成员函数;
给个简单例子
class A
{
private:
void fuck();
public:
void howfuck()
{
fuck();
}
};
#include "A.h"
class Fuck
{
public:
A xiha;
}
xiha.howfuck(); //这样就可以访问A类的私有成员fuck函数了
❺ c++中可不可以在一个类中访问另一个类的私有成员
可以,只要定义该类为另一个类的友元类即可。
友元类:
class A
{
friend class B
private: int aa;
};
class B
{
public:
void output()
{
cout << a.aa << endl;
}
private: A a;
}
使用友元类时:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。
(5)c扩展方法访问私有扩展阅读:
友元类使用注意事项:
1、友元可以访问类的私有成员。
2、只能出现在类定义内部,友元声明可以在类中的任何地方,一般放在类定义的开始或结尾。
3、友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类。
4、类必须将重载函数集中每一个希望设为友元的函数都声明为友元。
5、友元关系不能继承,基类的友元对派生类的成员没有特殊的访问权限。如果基类被授予友元关系,则只有基类具有特殊的访问权限。该基类的派生类不能访问授予友元关系的类。
参考资料来源:网络-友元类
❻ 高分 c++ typedef 访问基类的私有虚函数
//使用typedef来定义一个函数指针,可以参阅相关资料
typedefvoid(*Fun)(void);
voidmain()
{
Bb;//一个子类的对象
//这里如果不用typedef的话就应该是
//void(*pFun)(void);
FunpFun;
for(inti=0;i<3;i++)
{
//其实是得到b的地址,但是不能直接写成intaddr=&b;这样编译器会报错的
//所以才有了下面的两个*
intaddr=*(int*)&b;
//现在addr变成了存储b开始的地址的一个int型变量,所以我们还需要:
//classB的布局为:B的vtable,函数h的地址
//而B的vtable展开就是:函数g的地址,函数f的地址
//所以B的布局展开就是:函数g(被B覆写)的地址,函数f(A的f)的地址,函数h的地址
//每个地址占4个字节
//那么b+0为g的地址,b+4为f的地址,b+8为h的地址
//但是为什么循环里是按照1递增呢?因为上面的情况是按照char类型递增的
//根据C的寻址规则,增加一个int其实就是增加了4个字节
//所以我们有了(int*)addr,这是说按照int型的字长来增加寻址字节数
//经过上面的分析,可以知道:
//((int*)*(int*)(&b)+0)其实就是g的地址
//((int*)*(int*)(&b)+1)其实就是f的地址
//((int*)*(int*)(&b)+2)其实就是h的地址
//那么它终究还是一个地址,于是前面再加了一个*,就是函数的内容
pFun=(Fun)*((int*)*(int*)(&b)+i);
//然后开始运行这个函数
pFun();
}
}
vtable很复杂,可以参看C++对象模型那本书,如果只是想现在大致了解一下,可以参看下面的网址
http://blog.csdn.net/haoel/article/details/1948051/
我讲的也可能不对,不可尽信。
❼ c ++私有成员访问性
你这个问题有2方面的问题:
一:类和对象的概念你没搞清楚,类是对象的高度抽象,对象是类的实体化,在内存中来说,类就是一种数据类型跟int等式一样的,单说类是没有意义的,它并不占用内存,所以你这个类a的私有成员被类a对象访问本来就没任何意义。
二:类的私有成员是类的内部属性,就相当于一个人的心脏的跳动频率会让别人访问修改么一个道理,private的意思是在被继承或者类的外部无法访问这个成员,类在实体化后也就是建立对象后,具体对象的函数可以调用自己内部的private对象或者是友员函数也可以,private成员在不同的对象之间也是不能够相互访问的。
打字累死了,求给分。
❽ C ++如何调用私有private方法
C++可以在类内调用private函数,或者在友元函数内调用。
❾ 高手指教啊:C++把类成员设成私有的、用公有函数访问,和 直接把类成员设成公有的 有什么区别
1)可扩展性,比如一个Set函数,他一开始只是设置成员变量,后来因为功能变化,需要经过计算之后再设置成员变量,用Set函数可以很方便的修改,而且不影响使用者。如果直接使用成员变量,那么所有使用的地方都需要修改。
2)安全性,通过函数可以规定使用者的访问权限,比如一个类只提供了Get方法,那么使用者就不能修改这个成员变量,保证这个成员变量只有自己能够修改。如果直接访问公有成员变量,那么使用者就获得了完全的访问权限,他甚至可以在类的外部删除这个成员变量,等到该类再使用这个成员变量时,就会出现异常,这是非常不安全的。