C++中类的访问权限针对的是类而不是对象!(为什么类中的函数可以访问对象的私有成员?)
2017-06-22 21:18
791 查看
我们首先看一段程序:
编译通过,程序运行结果为:
这个程序非常的简单,但我们仔细一瞅会发现一个有趣的问题: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变量只可以被类的成员和桉树或者类的友元类/友元函数访问。但上面的程序为什么又运行通过了呢?
我们继续看下面的一个程序:
程序编译出错,错误信息: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了。
俗的讲,同类的对象间可以“互相访问”对方的数据成员,只不过访问途径不是直接访问。
方法是:通过一个对象调用其public成员函数,此成员函数可以访问到自己的或者同类其他对象的public/private/protected数据成员和成员函数(类的所有对象共用),而且还需要指明是哪个对象的数据成员(调用函数的对象自己的成员不用指明,因为有this指针;其他对象的数据成员可以通过引用或指针间接指明)
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指针;其他对象的数据成员可以通过引用或指针间接指明)
相关文章推荐
- C++为什么类的成员函数中(复制构造函数,赋值操作符等)可以有貌似类的对象访问类的私有成员的用法?
- C/C++—— 除了用类成员函数访问类私有成员变量外,还可以通过类对象地址来直接访问和修改类的私有成员变量
- C++ 类的继承,子类以及之类的对象 对父类成员函数的访问权限
- C++本类可以访问本身类的私有成员(即拷贝构造函数可以访问本身对象的私有成员)
- 理解类级别的访问控制权限——类的成员函数可以访问该类所有对象的私有成员
- 因为成员函数属于同一个类的所有对象,所以在成员函数内可以访问同类其他对象的私有成员是合理的
- 类成员函数可以访问相同类对象的私有对象
- C++在类的成员函数中,允许直接访问该类的成员对象的私有成员变量
- C++的const类成员函数(解释为什么非const成员函数不能访问const对象的数据成员)
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C++在类的成员函数中,允许直接访问该类的成员对象的私有成员变量
- 为什么c++中,有时可以用类名直接访问非静态成员函数?
- C++ 为什么类的构造函数可以访问类的私有成员?解惑
- 为什么一个对象调用的类方法可以访问该类其他对象的私有成员
- 同一个类的不同对象,对象的成员函数可以互相访问各自对象的私有变量和私有成员函数
- C++对象中的私有成员变量可以被访问
- C++中的线程函数如何访问类中的成员变量
- 在重载运算符时,类的对象可以直接访问私有成员解惑
- C++成员变量、函数修饰符与访问权限