上海网站推广营销设计,深圳网站设计哪好,ps网页排版设计,wordpress文章进不去私有成员变量的概念#xff0c;在脑海中的现象是#xff0c;以private关键字声明#xff0c;是类的实现部分#xff0c;不对外公开#xff0c;不能在对象外部访问对象的私有成员变量#xff0e; 然而#xff0c;在实现拷贝构造函数和赋值符函数时#xff0c;在函数里利… 私有成员变量的概念在脑海中的现象是以private关键字声明是类的实现部分不对外公开不能在对象外部访问对象的私有成员变量 然而在实现拷贝构造函数和赋值符函数时在函数里利用对象直接访问了私有成员变量因而产生了困惑下面以具体实例进行说明 疑惑为什么第26行和第32行代码可以编译通过而第39行和第40行代码会产生编译错误 class CTest {
public:CTest(int i); CTest(const CTest rhs);CTest operator(const CTest rhs);void printCTest(const CTest rhs);
private:int value;
};CTest::CTest(int i):value(i)
{coutContructor of CTestendl;
}CTest::CTest(const CTest rhs):value(rhs.value)
{coutCopy contructor of CTestendl;
}CTest CTest::operator(const CTest rhs)
{coutAssign function of CTestendl;if(this rhs)return *this;value rhs.value; //通过对象访问私有成员变量return *this;
}void CTest::printCTest(const CTest rhs)
{coutrhs.valueendl; //通过对象访问私有成员变量
}int main()
{CTest t 1;CTest tt 2;// coutt.valueendl; //通过对象访问私有成员变量编译错误// couttt.valueendl; //通过对象访问私有成员变量编译错误t.printCTest(tt);
} 产生这种疑惑的原因是自己对私有成员变量的理解有误封装是编译期的概念是针对类型而非对象的在类的成员函数中可以访问同类型实例对象的私有成员变量 具体的解析如下从变量value的符号是怎么解析的分析 1.确定符号的查找域 如第26行代码当编译器发现value变量时它会在value变量所属的对象rhs的类域中寻找该符号 2.确定当前域中哪些符号可以访问 由第1步可知当前查找的域是类域而printCTest函数在CTest类体中所以printCTest可以访问CTest类中的所有变量(包括私有成员变量)因而value符号在CTest类域中被找到 如第39行代码main函数不在CTest类体中所以main函数不可以访问CTest类域中的私有成员变量 3.符号已查找到编译通过 类成员变量的访问权限是编译器强加的编译器可以找到value通过编译自然就可以访问到value变量的值 直觉上我们会以为第26行代码中value符号的查找域应该是对象rhs对应的作用域然而C编译器的实现却是在对象rhs的类域查找value符号 启发有些直觉是靠不住的需要深入分析其背后的实现原理才可以理解透彻 总结C的访问修饰符的作用是以类为单位而不是以对象为单位。 通俗的讲同类的对象间可以“互相访问”对方的数据成员只不过访问途径不是直接访问. 步骤是通过一个对象调用其public成员函数此成员函数可以访问到自己的或者同类其他对象的public/private/protected数据成员和成员函数(类的所有对象共用)而且还需要指明是哪个对象的数据成员(调用函数的对象自己的成员不用指明因为有this指针其他对象的数据成员可以通过引用或指针间接指明)转载于:https://www.cnblogs.com/yanqi0124/p/3828507.html