学习笔记-----关于C++中类的成员函数可以访问私有成员的问题
2016-10-15 10:14
387 查看
直接上代码吧
大致就是这样,主要考虑拷贝构造函数vectorList(const vectorList<T> & rhs);该函数的定义如下:
显然,在这个成员函数中rhs直接访问了自身的私有成员vectorLength和listSize
而如果在main.cpp里也这样调用的话就是错的
vectorList<int> vec(2);
cout << vec.vectorLength << endl; 错误:编译器会提示没有访问权限
查了一些资料发现
1:与C++机制有关,是C++特殊规定的操作,因为类是设计者自己设计的,设计者完全知道类内部的组成,不需要对设计者隐藏。而使用者即用户不知道类的内部结构,所以分出Public,protected,和private.而且不能再main中调用
2:访问限定符public,protected,private是对其他的类和其他的操作而言的,即如果两个对象属于一个类:上述rhs和*this,在其中一个对象的成员函数中是可以直接调用另一个对象的私有或者保护成员的
3:因为类的接口与封装已经是安全的(对外不可见的),所以在类内部这样使用是不存在不安全问题的
4:如果没有这一机制,则上述拷贝构造函数的初始化就需要在类内增加一些成员函数来返回私有或者保护成员。
template<class T> class vectorList : public linearList<T> { public: vectorList(size_t initCapacity = 10); vectorList(const vectorList<T> & rhs); ~vectorList(); ...... protected: void checkIndex(size_t theIndex); vector<T> element; size_t vectorLength; size_t listSize; }
大致就是这样,主要考虑拷贝构造函数vectorList(const vectorList<T> & rhs);该函数的定义如下:
template<class T> vectorList<T>::vectorList(const vectorList<T>& rhs) : element(vector<T>(rhs.vectorLength)), vectorLength(rhs.vectorLength), listSize(rhs.listSize) { copy(rhs.element.begin(), rhs.element.end(), element); }
显然,在这个成员函数中rhs直接访问了自身的私有成员vectorLength和listSize
而如果在main.cpp里也这样调用的话就是错的
vectorList<int> vec(2);
cout << vec.vectorLength << endl; 错误:编译器会提示没有访问权限
查了一些资料发现
1:与C++机制有关,是C++特殊规定的操作,因为类是设计者自己设计的,设计者完全知道类内部的组成,不需要对设计者隐藏。而使用者即用户不知道类的内部结构,所以分出Public,protected,和private.而且不能再main中调用
2:访问限定符public,protected,private是对其他的类和其他的操作而言的,即如果两个对象属于一个类:上述rhs和*this,在其中一个对象的成员函数中是可以直接调用另一个对象的私有或者保护成员的
3:因为类的接口与封装已经是安全的(对外不可见的),所以在类内部这样使用是不存在不安全问题的
4:如果没有这一机制,则上述拷贝构造函数的初始化就需要在类内增加一些成员函数来返回私有或者保护成员。
相关文章推荐
- C++中类的访问权限针对的是类而不是对象!(为什么类中的函数可以访问对象的私有成员?)
- 关于友元函数无法访问类中私有成员等问题
- 【C++学习笔记】关于预处理器的几个问题
- JNI学习笔记:C++代码访问Java类中的成员和方法
- 关于C++静态成员函数访问非静态成员变量的问题
- 关于C++中私有继承后虚函数的访问权限与私有继承后多态的问题
- C++对象中的私有成员变量可以被访问
- C++学习笔记12:类成员初始化等问题
- C++学习笔记(十一):成员访问运算符(点运算和箭头运算)
- 理解类级别的访问控制权限——类的成员函数可以访问该类所有对象的私有成员
- C++本类可以访问本身类的私有成员(即拷贝构造函数可以访问本身对象的私有成员)
- C/C++—— 除了用类成员函数访问类私有成员变量外,还可以通过类对象地址来直接访问和修改类的私有成员变量
- 关于C++静态成员函数访问非静态成员变量的问题
- 【从C到C++学习笔记】类声明/公有私有保护成员/数据抽象和封装
- NDK开发学习笔记—C/C++访问java成员
- C++为什么类的成员函数中(复制构造函数,赋值操作符等)可以有貌似类的对象访问类的私有成员的用法?
- c++中,同个类的不同实例可以相互访问对方的私有、保护成员
- C++ 为什么类的构造函数可以访问类的私有成员?解惑
- C++学习笔记---关于指针
- 学习笔记一(一个关于TextOut和Invalidate的问题)