6个回答
展开全部
你这个问题有2方面的问题:
一:类和对象的概念你没搞清楚,类是对象的高度抽象,对象是类的实体化,在内存中来说,类就是一种数据类型跟int等式一样的,单说类是没有意义的,它并不占用内存,所以你这个类a的私有成员被类a对象访问本来就没任何意义。
二:类的私有成员是类的内部属性,就相当于一个人的心脏的跳动频率会让别人访问修改么一个道理,private的意思是在被继承或者类的外部无法访问这个成员,类在实体化后也就是建立对象后,具体对象的函数可以调用自己内部的private对象或者是友员函数也可以,private成员在不同的对象之间也是不能够相互访问的。
打字累死了,求给分。
一:类和对象的概念你没搞清楚,类是对象的高度抽象,对象是类的实体化,在内存中来说,类就是一种数据类型跟int等式一样的,单说类是没有意义的,它并不占用内存,所以你这个类a的私有成员被类a对象访问本来就没任何意义。
二:类的私有成员是类的内部属性,就相当于一个人的心脏的跳动频率会让别人访问修改么一个道理,private的意思是在被继承或者类的外部无法访问这个成员,类在实体化后也就是建立对象后,具体对象的函数可以调用自己内部的private对象或者是友员函数也可以,private成员在不同的对象之间也是不能够相互访问的。
打字累死了,求给分。
更多追问追答
追问
那实例化是什么意思?再解释下,我现在糊涂了。。。。谢谢
追答
类就是一个模板 比如说我做了一个蛋糕的模子 张什么样多大都是给你看到 但是不是能吃是吧 这就是类 我真正把她做成蛋糕 有大小了 能吃了 能具体应用了这就是实例化 简单的说我建立一个int的值这就是把int类实例化一个对象int类型的数 类也是一样的 可以大概这么理解
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企...
点击进入详情页
本回答由Storm代理提供
展开全部
原则上,C++类中私有变量不允许在类之外的其他任何地方访问,一般来说功能完善的类都会提供get,set方法来操作类属性值,还有就是就是通过友元访问。但是!但如果没有get、set方法都没有提供,也没有定义友元,比如使用的是第三方提供的.o(或者动态库)来进行开发的,并且实际应用中我们确确实实需要改变其中某个对象的一个私有参数,有没有什么办法呢?还有一种比较文艺青年的方法,我们知道,一个进程有程序段和数据段,如果我们知道了对象的数据空间,那么得到该对象的成员变量值也就很简单了,而实际上,对象数据段的首地址其实就是对象地址,以例子说明:
方法1:普通青年
友元方法:
#include<iostream.h>
class A
{
int t;
public:
A()
{
t=2002;//在构造函数中初始化成员变量t
}
friend class B;//声明友元类classB
};
class B
{
public:
A a;
int sum()
{
return a.t+1500;//友员class B访问class A中的私有成员变量t
}
};
void main()
{
B b;
cout<<b.sum()<<endl;
}
方法2:文艺青年
内存地址操作法
我们知道,C++编译器将数据和程序段分开,所有的类变量会按照声明顺序依次存入数据段,所以,如果知道了第一个变量的地址,那么后面的地址也就依次累加即可逐一求出了。有了变量地址,那么也就可以对它的值进行修改了。还是以上面的例子来说明,一下程序编写了如何更改类成员b的值:
#include <iostream>
#include <string>
using namespace std;
class center
{
public:
void setX(float _x){x=_x;}
void setY(float _y){y=_y;}
void setMeanValue(float avg){meanValue=avg;}
float getX(){return x;}
float getY(){return y;}
float getMeanValue(){return meanValue;}
center():x(0.0),y(0.0),meanValue(0.0){}
private:
float x;
float y;
float meanValue;
};
int main()
{
center A;
//普通青年的赋值方法;
A.setX(1.0);
A.setY(4.0);
A.setMeanValue(13.0);
cout<<A.getX()<<" "<<A.getY()<<" "<<A.getMeanValue()<<endl;
//文艺青年的赋值方法;
//*((float*)&A):将center对象A的内存空间强制类型转化为用int*指向的内存空间,访问该内存
float tmp = *((float*)&A);
cout<<tmp<<endl;//输出A.x的值
tmp = *((float*)&A + 1);
cout<<tmp<<endl;//输出A.y的值
*((float*)&A + 2)=2;//修改anValue的值
cout<<A.getMeanValue()<<endl;
}
你也可以通过友元的内存地址来操作,即通过class B 的内存地址访问 class A的私有成员。
此外,另附一篇与此类似的文章,也很有启发性。
分析程序员和黑客的区别
题目:
设有如下C++类
class A
{
int value;
public:
A(int n = 0) : value(n) {}
int GetValue()
{
return value;
}
};
请使用某种方式来在类的外部改变私有成员A::value的值。
程序员的可能做法:
class A
{
int value;
public:
A(int n = 0) : value(n) {}
int GetValue()
{
return value;
}
void SetValue(int n)
{
value = n;
}
};
void f()
{
A a;
a.SetValue(5);
}
黑客的可能做法:
void f()
{
A a;
*((int *)&a) = 5;
}
方法1:普通青年
友元方法:
#include<iostream.h>
class A
{
int t;
public:
A()
{
t=2002;//在构造函数中初始化成员变量t
}
friend class B;//声明友元类classB
};
class B
{
public:
A a;
int sum()
{
return a.t+1500;//友员class B访问class A中的私有成员变量t
}
};
void main()
{
B b;
cout<<b.sum()<<endl;
}
方法2:文艺青年
内存地址操作法
我们知道,C++编译器将数据和程序段分开,所有的类变量会按照声明顺序依次存入数据段,所以,如果知道了第一个变量的地址,那么后面的地址也就依次累加即可逐一求出了。有了变量地址,那么也就可以对它的值进行修改了。还是以上面的例子来说明,一下程序编写了如何更改类成员b的值:
#include <iostream>
#include <string>
using namespace std;
class center
{
public:
void setX(float _x){x=_x;}
void setY(float _y){y=_y;}
void setMeanValue(float avg){meanValue=avg;}
float getX(){return x;}
float getY(){return y;}
float getMeanValue(){return meanValue;}
center():x(0.0),y(0.0),meanValue(0.0){}
private:
float x;
float y;
float meanValue;
};
int main()
{
center A;
//普通青年的赋值方法;
A.setX(1.0);
A.setY(4.0);
A.setMeanValue(13.0);
cout<<A.getX()<<" "<<A.getY()<<" "<<A.getMeanValue()<<endl;
//文艺青年的赋值方法;
//*((float*)&A):将center对象A的内存空间强制类型转化为用int*指向的内存空间,访问该内存
float tmp = *((float*)&A);
cout<<tmp<<endl;//输出A.x的值
tmp = *((float*)&A + 1);
cout<<tmp<<endl;//输出A.y的值
*((float*)&A + 2)=2;//修改anValue的值
cout<<A.getMeanValue()<<endl;
}
你也可以通过友元的内存地址来操作,即通过class B 的内存地址访问 class A的私有成员。
此外,另附一篇与此类似的文章,也很有启发性。
分析程序员和黑客的区别
题目:
设有如下C++类
class A
{
int value;
public:
A(int n = 0) : value(n) {}
int GetValue()
{
return value;
}
};
请使用某种方式来在类的外部改变私有成员A::value的值。
程序员的可能做法:
class A
{
int value;
public:
A(int n = 0) : value(n) {}
int GetValue()
{
return value;
}
void SetValue(int n)
{
value = n;
}
};
void f()
{
A a;
a.SetValue(5);
}
黑客的可能做法:
void f()
{
A a;
*((int *)&a) = 5;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你举个例子,说清楚点,这样描述含糊不清的没办法回答。
类A的私有成员b能够被类A的成员函数访问。
class A{
private b
void fun(){
访问b //这是正确的,可访问的。
}
}
而下面这种情况是不能访问的
class C{
void fun(){
A a=new A(); //A的实例a
a.b=3; //这是错误,因为类C不能访问类A的私有成员b
}
}
很久没写C++了,可能有点语法错误,但大致意思不会错得。
类A的私有成员b能够被类A的成员函数访问。
class A{
private b
void fun(){
访问b //这是正确的,可访问的。
}
}
而下面这种情况是不能访问的
class C{
void fun(){
A a=new A(); //A的实例a
a.b=3; //这是错误,因为类C不能访问类A的私有成员b
}
}
很久没写C++了,可能有点语法错误,但大致意思不会错得。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不能访问,但是你可以通过访问接口对b进行访问,类似C# 或Java中的属性器。例如:
private:
char* str;
public char[] getStr()
{
return str;
}
public char[] setStr(char* str1)
{
this.str=str1;
}
private:
char* str;
public char[] getStr()
{
return str;
}
public char[] setStr(char* str1)
{
this.str=str1;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
对,私有成员仅能在类内访问,如果想访问私有成员,应该在类的成员函数中访问
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询