在学习拷贝构造函数的过程中,突然想到了非常诡异的一点:为什么新对象可以访问原对象的私有变量?如下:
class Student{
private:
string name;
int age;
public:
Student(string name,int age):name(name),age(age){}
Student(const Student & student){
this->name = student.name;
this->age = student.age;
}
};
答案非常简单。
首先明确封装的含义:
封装是编译期的概念,是针对类型而非对象的,在类的成员函数中可以访问同类型实例对象的私有成员变量。所以对于访问权限的错误,是编译期间爆出来的,这时期对象还没有创建,所以只能从类的层面控制访问类型。一个类的成员函数可以访问这个类的私有数据成员,我们要理解这个对类的访问限制,而不是针对对象。
所以不仅仅的拷贝构造函数,类的任何函数都可以设计成这样,即:一个对象的函数可以访问其他对象的私有变量。
demo:
#include <iostream>
using namespace std;
class Student{
private:
string name;
int age;
public:
Student(string name,int age):name(name),age(age){}
Student(const Student & student){
this->name = student.name;
this->age = student.age;
}
void display(){
cout<<name<<" "<<age<<endl;
}
void displayOther(Student student){
cout<<student.name<<" "<<student.age<<endl;
}
};
int main() {
Student student1("Tom",11);
Student student2(student1);
Student student3("Jerry",12);
student2.display();
student2.displayOther(student3);
}
运新结果:
Tom 11
Jerry 12