随笔分类 -  C++面向对象编程

参数传递的三种方式
摘要:1.按值传递void swap(int a, int b){ int temp = a; a = b; b = temp;}int main(){ int a = 2, b =3; swap(a, b); return 0;}优点:便于阅读缺点:不能改变主函数中的值2.按指针传递void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}int main(){ int a = 2, b =3; swap(&a, &b); return 0;}优点:可以改变主函数的值,传参时不需要大量的复制缺点:不易阅读,容易出错3 阅读全文

posted @ 2012-01-22 14:39 windmissing 阅读(448) 评论(0) 推荐(0)

输入输出运算符重载总结
摘要:1.输出运算符的重载ostream& operator<<(ostream& s, const A& a){ s<<a.rx<<' '<<a.ry<<endl; return s;}2.输入运算符重载istream& operator>>(istream& s, A& a){ s>>a.rx>>a.ry; return s;}3.根据运算符左边对象的类型判断是流运算符还是移位运算符4.ostream类没有公有的复制构造函数,因此该函数无 阅读全文

posted @ 2012-01-22 13:02 windmissing 阅读(258) 评论(0) 推荐(0)

记录,待总结10
摘要:1.在一个类中定义了一个新的类型,这个类型只能在该类用使用。新类型称为嵌套类2.endl在执行时,做两件事情:1)输入'\n'2)刷新缓冲区flush()解释:执行换行符\n与执行结束符endl,最大的区别在处理文件上,以文件输出流(ofstream)为例。当流的缓冲区未满时,执行'\n'是不会马上写到文件里。但是执行endl会强行把缓冲区里的内容写入文件中。3.输出数据到文件的步骤:1)包含头文件stream2)建立ofstream对象:ofstream ocout;3)将对象与文件关联:ocout.open("123.txt");4)使用 阅读全文

posted @ 2012-01-18 15:02 windmissing 阅读(120) 评论(0) 推荐(0)

记录,待总结9
摘要:1.字符数组、字符串与string类的区别例1:int main(){ string s; cin>>s;//输入:dog if(s == "dog") cout<<"狗"<<endl; char ch[10]; cin>>ch;//输入:cat if(ch == "cat") cout<<"猫"<<endl; return 0;}输出:dog //输入狗 //输出cat//输入解释:数组名是该数组第一个元素的内存地址用引号括起来的字符串也代表 阅读全文

posted @ 2012-01-18 14:44 windmissing 阅读(125) 评论(0) 推荐(0)

函数指针总结
摘要:1.一个函数的指针,必须确保该函数被定义且分配了内存,否则将指向空地址,这是指针的大忌。2.函数指针的使用条件:参数、返回值都吻合‘3.函数指针没有++或--的运算4.函数指针作为参数的最好的例子就是回调函数5.函数指针的使用例:void (*p)(int &, int &);void cube(int &x, int &y){ x = x * x * x; y = y * y * y;}void Test(void (*p)(int &, int &), int &a, int &b){ p(a, b); cout<< 阅读全文

posted @ 2012-01-18 14:25 windmissing 阅读(225) 评论(0) 推荐(0)

记录,待总结8
摘要:1. 传递数组的3种方式1)void func(int a[]);2)void func(int a[5]);3)void func(int *a);例:void func1(int a[], int n);void func2(int a[5], int n);void func3(int *a, int n);int main(){ int a[10], i; for(i = 0; i < 10; i++) a[i] = i + 1; func1(a, 10); func2(a, 10); func3(a, 10); return 0;}void func1(int a[], int 阅读全文

posted @ 2012-01-18 09:54 windmissing 阅读(148) 评论(0) 推荐(0)

记录,待总结7
摘要:1.派生类指针必须强制转换为基类指针后才可以指向基类基类指针转换为派生类指针容易导致崩溃性错误虚基类的引用或派生不能转换为派生类2.father *pf = new son;//先构造父,再构造子,但pf指向的是父的对象。因此pf只能调用father的成员,不能调用son的成员delete pf;//只析构父,不析构子,造成内存泄漏解决方法:1)pf强制转换为son类,这种方法不好,容易出错2)将father的析构函数定义为virtual,以实现多态3.虚函数实现动态联编,开销大4.联编:将一个调用函数者联结上正确的被调用者静态联编:在编译时联编,在执行时不联编动态联编:在编译时不联编,在执行 阅读全文

posted @ 2012-01-17 20:59 windmissing 阅读(93) 评论(0) 推荐(0)

多重继续的二义性总结
摘要: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 阅读(168) 评论(0) 推荐(0)

记录,待总结6
摘要: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 阅读(103) 评论(0) 推荐(0)

记录,待总结5
摘要: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 阅读(131) 评论(0) 推荐(0)

记录,待总结4
摘要: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 阅读(106) 评论(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 阅读(324) 评论(0) 推荐(0)

指针与引用的混合使用总结
摘要:1.指针是间接访问,因为要用*来读取地址处的数据。将指针作为函数的接收参数是间接引用的方式引用是直接访问,因为引用是别名,不用任何符号就可以直接读取该对象的数据。将别名作为函数的接收参数是直接引用2.指针引用是否可以为空可以不可以是否可以初始化可以可以是否可以赋值可以不可以是否可以访问堆可以不可以不否可以改变对象可以改变指向的对象,可以改变对象的值不可以改变引用的对象,可以改变对象的值3.例1:int &r = new int; //错误,不可以直接引用来指向堆中空间4.例2:int *p = new int; int &r = *p; //正确,r是通过指针p读取到的未命名i 阅读全文

posted @ 2012-01-16 10:39 windmissing 阅读(604) 评论(0) 推荐(1)

引用总结
摘要:1.引用就是别名,如int &rnum = num;例1:int main(){ int a; int &ra = a; ra = 999; cout<<"a:"<<a<<endl; a = 0; cout<<"ra:"<<ra<<endl; cout<<&a<<' '<<&ra<<endl; return 0;}输出:a:999 //改变ra会导致a做同样的改变ra:0 //改变a会导致 阅读全文

posted @ 2012-01-14 19:33 windmissing 阅读(133) 评论(0) 推荐(0)