C++ c++;编程问题2
嗨 我对C++很陌生。我只写了一个C++代码,它遵循: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 = "
#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;