您的位置:首页 > 编程语言 > C语言/C++

C++中类的访问权限针对的是类而不是对象!(为什么类中的函数可以访问对象的私有成员?)

2017-06-22 21:18 791 查看
我们首先看一段程序:

class A {
private:
int i;
public:
A(int i): i(i) {}
void print(A a) {
cout << a.i <<endl;
}
};

int main() {
A B(5);
A C(4);
B.print(C);
return 0;
}


编译通过,程序运行结果为:

4

Process returned 0 (0x0)   execution time : 0.048 s
Press any key to continue.


这个程序非常的简单,但我们仔细一瞅会发现一个有趣的问题:private的变量i怎么直接可以通过对象访问了!

我们知道在C++的类中访问权限分为private,protected,public三种:

private; that is, its name can be used only by members and friends of the class in which it is declared.

protected; that is, its name can be used only by members and friends of the class in which it is declared, and by members and friends of classes derived from this class (see 11.5).

public; that is, its name can be used anywhere without access restriction.

上面写的清清楚楚,private变量只可以被类的成员和桉树或者类的友元类/友元函数访问。但上面的程序为什么又运行通过了呢?

我们继续看下面的一个程序:

class A {
private:
int i;
public:
A(int i): i(i) {}
void print(A a) {
cout << a.i <<endl;
}
};

void test(A a) {
cout << a.i <<endl;
}

int main() {
A B(5);
test(B)
return 0;
}


程序编译出错,错误信息:F:\ACM\simple_test\Cpp_test\main.cpp|57|error: ‘int A::i’ is private|

这次是符合我们预期的!那为什么这两次结果不一样呢?

我们仔细看上面的定义会发现,访问权限控制其实是针对而言的,并不是对象

也就是说编译器遇到i变量时,它会在i变量所属的class A寻找该符号,很显然在这个类中是可以直接访问i变量的。所有在print函数中可以访问i变量,甚至可以方位其他类对象的i的变量。

而在test()函数中,因为它的作用域已经超过了class A,所有就没有办法访问i了。

总结

C++的访问修饰符的作用是以类为单位,而不是以对象为单位。

俗的讲,同类的对象间可以“互相访问”对方的数据成员,只不过访问途径不是直接访问。

方法是:通过一个对象调用其public成员函数,此成员函数可以访问到自己的或者同类其他对象的public/private/protected数据成员和成员函数(类的所有对象共用),而且还需要指明是哪个对象的数据成员(调用函数的对象自己的成员不用指明,因为有this指针;其他对象的数据成员可以通过引用或指针间接指明)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐