编译器构造 - C++ 编程问题 2.

compiler construction - c++ programming problem 2

本文关键字:编程 问题 C++ 编译器      更新时间:2023-10-16

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.xa.y正在尝试从类外部访问xy成员。如果它们不是公开的,这些尝试将失败,如您所见。

如果希望默认访问为公共而不是专用,请使用 struct 而不是 class

默认情况下,您在类中定义的字段是"私有"字段,只能由该类的方法使用。

您需要将 x 和 y 定义为类的"公共"成员。

class complex
{
 public:
 float x,y;
};

publicprivateprotected是编译时的概念。在运行时,它们甚至不存在。清除了,让我们继续讨论为什么无法访问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等。

要访问类的私有成员,您可以:

  1. 提供公共方法来读取和写入私有成员的值。这样,类可以完全控制访问操作。
  2. 提供公共方法来返回私有成员的指针或引用。这不是一个好方法,因为对象的状态可能会被破坏。
  3. 将类或函数清除为包含私有成员的类的好友,以便好友可以访问所有成员。确保好友在类的数据成员上正确操作。

私有、受保护和公共仅在编译时生效,防止错误的代码破坏对象的状态。他们没有运行时安全控制的业务。

让我们举个例子,看看下面的简单堆栈类:

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字节内存块地址的代码都可以读写它们,私有与此无关。