编译器构造 - C++ 编程问题 2.
compiler construction - c++ programming problem 2
Hi我对 c++ 很陌生。我只写了一个 c++ 代码,如下所示:
#include<iostream>
using namespace std;
class complex
{
float x,y;
};
int main ()
{
complex a;
a.x=500;
a.y=600;
cout<<" the value of a.x = "<<a.x<<"n" ;
cout<<" the value of a.y = "<<a.y<<"n" ;
return 0;
}
当我编译程序时,它给了我以下错误:
try.cpp: In function ‘int main()’:
try.cpp:5: error: ‘float complex::x’ is private
try.cpp:10: error: within this context
try.cpp:5: error: ‘float complex::y’ is private
try.cpp:11: error: within this context
try.cpp:5: error: ‘float complex::x’ is private
try.cpp:12: error: within this context
try.cpp:5: error: ‘float complex::y’ is private
try.cpp:13: error: within this context
我通过仅声明数据成员公共来解决错误;
现在我应该怎么做才能使这个东西与私人成员一起工作?为什么我无法访问具有类对象的私有成员?如何直接访问私有数据成员,或者为什么不能将类的数据成员直接与类对象一起使用?背后的原因是什么?
类是如何在内存中实现的?类如何阻止我们或阻止我们使用其私人数据或实现其安全机制?当看到一个类时,编译器会做什么?编译器如何实现类及其安全机制?
请向我解释一下
现在我应该怎么做才能使这个东西与私人成员一起工作?
如果将它们设为private
,则可以编写构造函数并向类中添加其他有用的函数,以对复杂对象进行操作:
class complex
{
float _x;
float _y;
public:
complex(float x=0.0, float y=0.0) : _x(x), _y(y) {}
//^^^^^^^^^^^^^its initialization list!
complex operator + (const complex & c)
{
return complex(_x + c._x, _y + c._y);
}
ostream & print(ostream & out) const
{
return out << "(" << _x << ", "<< _y << ")";
}
void print() const
{
print(cout);
cout << endl;
}
//and so on
};
ostream & operator << (ostream & out, const complex &c)
{
return c.print(out);
}
测试一下:
int main ()
{
complex a(500,600);
complex b(80,60);
complex c = a + b; //operator+() gets invoked!
a.print();
b.print();
c.print();
cout << "nprint using cout!" << endl;
cout << a << endl;
cout << b << endl;
cout << c << endl;
return 0;
}
输出:
(500,600)
(80,60)
(580,660)
print using cout!
(500,600)
(80,60)
(580,660)
查看在线演示 : http://www.ideone.com/TiGat
您的a.x
和a.y
正在尝试从类外部访问x
和y
成员。如果它们不是公开的,这些尝试将失败,如您所见。
如果希望默认访问为公共而不是专用,请使用 struct
而不是 class
。
默认情况下,您在类中定义的字段是"私有"字段,只能由该类的方法使用。
您需要将 x 和 y 定义为类的"公共"成员。
class complex
{
public:
float x,y;
};
public
、private
和protected
是编译时的概念。在运行时,它们甚至不存在。清除了,让我们继续讨论为什么无法访问private
数据。
private
就是它所说的——私人。这是完全的,除了类本身之外,没有从任何地方访问。默认情况下,除非另有指定,否则class
是私有的。
如果要默认public
,请struct
。除了默认的"隐私"之外,它们完全相同。
struct complex{
float x;
float y;
};
现在,您可以从任何地方访问成员。
对于进一步的东西,从我对你问题的印象来看,你似乎真的真的需要一本好C++书。
数据保护和抽象是面向对象编程的基本概念。除了Mark's Answer之外,我建议你阅读任何你最喜欢的C++编程书籍,如Eric Nagler的C++,A Hands On Approach或C++ Primer等。
要访问类的私有成员,您可以:
- 提供公共方法来读取和写入私有成员的值。这样,类可以完全控制访问操作。
- 提供公共方法来返回私有成员的指针或引用。这不是一个好方法,因为对象的状态可能会被破坏。
- 将类或函数清除为包含私有成员的类的好友,以便好友可以访问所有成员。确保好友在类的数据成员上正确操作。
私有、受保护和公共仅在编译时生效,防止错误的代码破坏对象的状态。他们没有运行时安全控制的业务。
让我们举个例子,看看下面的简单堆栈类:
class statck
{
private:
static const int buffersize = 100;
int buffer[buffersize];
int count;
public:
stack();
bool Push(int value);
bool Pop(int value);
int GetCount();
}
count 成员在逻辑上表示有多少值被推入堆栈,它的值由 Push、Pop 和构造函数管理,并且不应由使用堆栈类对象的代码更改,例如:
statck s;
s.count = 10;
代码的优点在逻辑上是没有意义的。如果计数是公共的,则可以编译代码,并且错误更难显示,并且通过将计数解密为私有,错误是显而易见的,并导致编译错误。
访问修饰符(公共的、受保护的和私有的)所做的所有事情都是告诉编译器,类的成员可能出现在类的成员方法以外的代码中的某些表达式中。我没有使用"访问"这个词,我认为这就是让你感到困惑的地方。
访问修饰符不会影响编译器生成的用于表示对象的内存布局。严格来说,布局取决于编译器和平台的字大小,但通常在 32 位系统上,statck 对象将是一个 404 字节长的内存块、400 字节的缓冲区和 4 字节的计数,无论缓冲区和计数是公共的还是私有的。而当程序运行时,每个获取404字节内存块地址的代码都可以读写它们,私有与此无关。
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 此动态编程问题的自上而下方法
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 寻找解决这个动态编程问题的提示
- 面临在 if 语句之外打印变量数据的问题 完成使用 Qt 编程
- 竞争性编程问题说错了答案
- 模板编程初学者问题
- 使用虚幻引擎4编程的平台游戏中的偏转问题
- 以编程方式锁定注册表项以避免并发问题
- 编程问题和概念
- C 编程问题
- 我可以使用Boost::Asio而不用担心网络编程问题吗?
- 基本C++编程问题
- 更改为整数时的双精度值编程问题
- 很少有QT编程问题
- 枚举的元编程问题
- 关于作用域的一般编程问题
- 编译器构造 - C++ 编程问题 2.
- C++ 编程问题