我正在学习C ++中OOP的基本概念,但我遇到了一个逻辑问题。
#include <iostream>
#include <conio.h>
using namespace std;
class A {
int i;
public:
void set(int x) {
i=x;
}
int get() {
return i;
}
void cpy(A x) {
i=x.i;
}
};
int main()
{
A x, y;
x.set(10);
y.set(20);
cout << x.get() << "\t" << y.get() << endl;
x.cpy(y);
cout << x.get() << "\t" << y.get() << endl;
getch();
}
我想在上面的代码中知道为什么我能够访问x.i
[第19行],它是不同对象中的私有成员。即使私有范围限制在同一个类中也是如此该对象作为参数传递?
答案 0 :(得分:13)
private
表示对类是私有的,而不是对象的私有。两种解释都是可能的,实际上有些语言选择了另一种语言。但是大多数语言都像C ++,并且允许同一类的对象访问另一个实例的私有成员。
答案 1 :(得分:5)
变量x
和y
是同一个类的两个实例。它们是不同的对象,但它们属于同一个类。这就是为什么可以从成员函数访问私有成员。
答案 2 :(得分:2)
类的私有属性或方法意味着无法直接从类范围外访问它。因为公共方法是在一个类中定义的,我们可以通过它来访问和操纵私有成员的值。
在上面的示例中,您不是直接从对象访问'i'
而是通过公共方法操作它。
这样想:你有一个银行账户,你在银行的钱是私人会员。你不能直接去银行自己拿钱。银行里的收银员就像是一种可以访问私人财产的公共方法,即你的钱,你可以通过收银员操纵你的钱。
答案 3 :(得分:0)
cpy(A x)
是该类的成员,它可以访问private
个字段和方法。
private
关键字限制来自其他类(对象)的访问以访问字段。属于某个类的任何代码都可以访问自己的私有成员(字段或方法)。
答案 4 :(得分:0)
一个类可以访问它自己的私有数据成员。
这也意味着如果您有任何处理两个或更多实例的函数(this
以及作为参数传递的内容),您可以访问对象的私有(和公共)变量/方法
答案 5 :(得分:0)
即使将对象作为参数传递,私有范围也不限于同一个类吗?
是的,这就是$customer = $customers->item(0)->appendChild($customer);
function insertCustomer()
{
try {
$xmlFile = "../../data/customer.xml";
$doc = DOMDocument::load($xmlFile);
$doc->formatOutput = true;
$customer = $doc->createElement('customer');
$customers = $doc->getElementsByTagName("customers");
$customer = $customers->item(0)->appendChild($customer);
$newID = getLastId() + 1;
$id = $doc->createElement('id');
$idValue = $doc->createTextNode($newID);
$id->appendChild($idValue);
$customer->appendChild($id);
$name1 = $doc->createElement('first_name');
$nameValue = $doc->createTextNode($_GET["name"]);
$value2 = $name1->appendChild($nameValue);
$name = $customer->appendChild($name1);
$name = $doc->createElement('surname');
$nameValue = $doc->createTextNode($_GET["name"]);
$value2 = $name->appendChild($nameValue);
$name = $customer->appendChild($name);
$name = $doc->createElement('password');
$nameValue = $doc->createTextNode($_GET["password"]);
$value2 = $name->appendChild($nameValue);
$name = $customer->appendChild($name);
$name = $doc->createElement('email');
$nameValue = $doc->createTextNode($_GET["email"]);
$value2 = $name->appendChild($nameValue);
$name = $customer->appendChild($name);
$name = $doc->createElement('phone');
$nameValue = $doc->createTextNode($_GET["phone"]);
$value2 = $name->appendChild($nameValue);
$name = $customer->appendChild($name);
$doc->save($xmlFile );
} catch(Exception $e) { echo $e;}
echo "customer successfully registered and your new Id = ". $newID;
}
正在访问同一类中的私有成员x
,即 A 类。