摘要: 1.多重继续的二义性,根本原因是假如A有Test(),则B和C都有Test(),于是D产生了二义性2.例1:class A{public: void Test(){cout<<"A"<<endl;}};class B{public: void Test(){cout<<"B"<<endl;}};class C : public A, public B{};int main(){ C c; c.Test(); //错误 c.A::Test(); //正确,输出:A c.B::Test(); //正确,输出:B 阅读全文
posted @ 2012-01-17 18:35 windmissing 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 1.派生类的对象可以赋给基类,反之不行基类的指针可以指向派生类,反之不行基类的引用可以初始化为派生类的对象,反之不行例1:class father{};class son:public father{};int main(){ father f; son s; f = s;//正确 s = f;//错误 father *pf = new son;//正确 son *ps = new father;//错误 father &rf = s;//正确 father &rs = f;//错误 return 0;}2.构造派生类对象时,先执行基类的构造函数,再执行子类的构造函数,析构反之 阅读全文
posted @ 2012-01-17 15:17 windmissing 阅读(94) 评论(0) 推荐(0) 编辑
摘要: 1.在某些特殊的情况下,赋值运算符必须先释放一些旧值,然后才能根据新值的类型分配新的数据。此时,自复制会出错2.operator关键字配合要转换的类型,构成了转换运算符的重载函数。该函数没有返回值,但可以在函数中返回一个转换后的值例1:待举例。3.两个很重要的例子例2:class A{public: A(){cout<<"construct "<<this<<endl;} A(const A& a){cout<<"copy "<<this<<endl;} ~A(){cout& 阅读全文
posted @ 2012-01-17 14:22 windmissing 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 1.delete运算符只能删除堆中的空间,删除栈中的空间会导致出错例1:int main(){ A a; A *p = new A; A *q = &a; delete p;//正确,因为p指向堆中的未命名空间 delete q;//错误,因为q指向栈中的空间 return 0;}2.关于强制类型转换例2:class A{ int x;public: A(int i):x(i){cout<<"construct "<<this<<endl;} A(const A& a){x = a.x;cout<<" 阅读全文
posted @ 2012-01-17 14:17 windmissing 阅读(97) 评论(0) 推荐(0) 编辑
摘要: 例1:class A{ int x;public: A(int i):x(i){} int get(){return x;}};A& func(){ A a(23); return a;}int main(){ A &r = func(); cout<<r.get()<<endl; return 0;}输出:1245000解释:r被初始化为返回值的别名。由于是按引用返回,返回值就是a的别名。因此,r就是a的别名。a是一个局部变量,func()结束后,a消失了。r成了一个空的引用。因此,输出的是上个随机值。例2:class A{ int x;public: 阅读全文
posted @ 2012-01-17 14:07 windmissing 阅读(303) 评论(0) 推荐(0) 编辑