C++ c++;编程问题2

C++ c++;编程问题2,c++,compiler-construction,C++,Compiler Construction,嗨 我对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 = "

嗨 我对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;
}
我通过将数据成员声明为public来解决错误

现在我该怎么做才能让这件事和私人会员合作? 为什么我不能使用类的对象访问私有成员? 如何直接访问私有数据成员,或者为什么不能将类的数据成员直接与类对象一起使用?这背后的原因是什么

类是如何在内存中实现的?类如何阻止或阻止我们使用其私有数据或实现其安全机制?当看到一个类时,编译器做什么? 编译器如何实现类及其安全机制

请给我解释一下

现在我该怎么做才能让这件事和私人会员合作

如果将它们设置为私有的,则可以编写构造函数并向类中添加其他有用的函数,以便对复杂对象执行操作:

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);
}

请参阅在线演示:

您的
a.x
a.y
正在尝试从类外访问
x
y
成员。如你所见,如果它们不公开,这些尝试将失败


如果希望默认访问是公共的而不是私有的,请使用
struct
而不是
class

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

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

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

public
private
protected
是编译时概念。在运行时,它们甚至不存在。问题解决了,让我们继续讨论为什么您不能访问
private
数据

private
就是它所说的-private。也就是说,除了类本身,其他任何地方都无法访问。默认情况下,
类在未另行指定之前是私有的。
如果默认情况下需要
public
,请使用
struct
。除了默认的“隐私”,它们完全一样

struct complex{
  float x;
  float y;
};
现在,您可以从任何地方访问成员



对于进一步的内容,从我对您的问题的印象来看,似乎是您。

数据保护和抽象是面向对象编程的基本概念。除了马克的回答,我建议你阅读你喜欢的C++编程书籍中的任何一种,比如Eric Nagler的C++,一个动手方法或C++底漆等。

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

  • 提供公共方法来读取和写入私有成员的值。通过这种方式,类可以完全控制访问操作
  • 提供公共方法以返回私有成员的指针或引用。这不是一个好方法,因为对象的状态可能会被破坏
  • Declear类或函数作为包含私有成员的类的朋友,以便朋友可以访问所有成员。确保好友在类的数据成员上正确操作
  • private、protected和public仅在编译时生效,以防止错误代码破坏对象的状态。他们不需要运行时安全控制

    让我们举一个例子,请参见下面的简单堆栈类:

    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 memeber逻辑上表示有多少值被推入堆栈,它的值由Push、Pop和构造函数管理,不应通过使用堆栈类对象的代码进行更改,如:

    statck s;
    s.count = 10;
    
    代码在逻辑上毫无意义。如果计数是公共的,那么代码就可以被编译,错误就更难被发现,通过将计数取消为私有的,错误是显而易见的,并且会导致编译错误

    访问修饰符(public、protected和private)所做的所有事情都是告诉编译器,类的哪些成员可以出现在代码中的某些表达式中,而不是类的成员方法中。我没有用“访问”这个词,我想这就是让你困惑的地方


    访问修饰符不会影响编译器生成的表示对象的内存布局。严格来说,布局取决于编译器和平台的字大小,但通常在32位系统上,statck对象将是404字节长的内存块,400字节用于缓冲区,4字节用于计数,无论缓冲区和计数是公共的还是私有的。当程序运行时,每一个获得404字节内存块地址的代码都可以读写它们,私有的与此无关。

    只是说,你忘了在你的y赋值中添加一个“=”符号。好的,我不理解构造函数的概念。这是什么类型的构造函数。我没有找到任何这种类型的构造函数。你能给我解释一下这种构造函数的工作原理吗。我没有得到运算符+的概念。它是什么?代码是如何工作的?请解释一下。那么我剩下的问题呢。@user513164:这叫做初始化列表。还有其他问题。得到一本关于C++的书。你需要先读一些好书。你用什么教程来学习C++?谢谢帮助,但是我知道,但是我问的其余问题呢?请仔细阅读我的问题fully@user513164,如果你不知道公共和私人的区别,我也帮不了你什么。这是非常基本的东西。我知道所有关于访问说明符的东西,但我只想知道内存中发生了什么。事情是如何在内存中实现的。当编译器看到类名时会做什么?我知道这个概念,我只想知道内存中发生了什么,或者这个安全机制是如何实现的。就像我们知道的,当我们声明一个数组时,一个指针在内存中形成,数组项的其余部分使用这个基址和下标作为偏移量。同样,我想知道类是如何实现的内存中发生了什么。编译器对类名或h做什么
    struct complex{
      float x;
      float y;
    };
    
    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();
    }
    
    statck s;
    s.count = 10;