C++学习笔记与实验记录.docx_第1页
C++学习笔记与实验记录.docx_第2页
C++学习笔记与实验记录.docx_第3页
C++学习笔记与实验记录.docx_第4页
C++学习笔记与实验记录.docx_第5页
已阅读5页,还剩127页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+实验记录C+课堂学习笔记对象的操作 Student a,b;FuncA(a);FuncB(a); ; ;FuncAX(a); 改为操作对象Student a,b;FuncA();FuncB(); ; ;FuncAX();对象的操作Student a,b;Student * p;p = &a;FuncA(*p);FuncB(*p); ; ;FuncAX(*p); 改为操作对象Student a,b;Student * p;p = &b;FuncA(*p);FuncB(*p); ; ;FuncAX(*p由上可见指针的灵活,对程序的贡献一类1. 指针分量和对象分量class student int age; char name9; float score;student a;student *p=&a;a.age=20; p-age=20; /.的前面是对象&a-age=20; (*p).age=20; /-的前面是地址2. 成员函数与普通函数的区别: 成员函数属于类, 成员函数定义是类设计的一部分, 其作用域是类作用域. 而普通函数一般为全局函数 成员函数的操作主体是对象,使用时通过捆绑对象来行使其职责, 而普通函数被调用时没有操作主体2. 公有&保护&私有类的访问权限分为对内和对外,类内:类的定义本身,友元,类外:别的函数,自己类的对象,我的继承类,指针,所谓的私有就是不可以通过对象,直接访问Class默认是private权限,Struct默认是public权限class Student public: float score; void p() age=20; void q() add();/类中的公有和私有的成员可以互相访问,函数也可以互相调用,因为它们是好兄弟 void r(int a)cout成员;/-前是指针 变量作用域int a = 1;main()void f(void);couta;int a = 2;couta;局部参数掩盖全局参数int a =3;couta;couta; f();couta;void f()couta;int a = 4;couta;例子;/类定义的作用域等同于变量class A ;void f() class B ; A s; B t; class C ; A s; B t; C u; A s; B t; C u;C不行了,作用域已脱离main() A s; B t; C u;B和C都不行了class Date int year, month, day;void set ( int y, int m, int d ) year=y; month=m; day=d; bool isLeapYear ( ); bool Date:isLeapYear ( ) return ! ( year%400 ) | !(year%4) & year%100;把函数写在外面,更清晰函数定义不可放在头文件中,重复定义函数默认参数 int x(int i,int j=11,int k=12) i没有定义默认参数,就需要参数传递,没有传递参数就错,而k,j已经定义了初值,可以不传参数,要是传了参数,会把原来的值覆盖了 coutijk;void main() x(); /错误 x(1); /输出结果:1 11 12 x(1,2); /输出结果:1 2 12 x(1,2,3); /输出结果:1 2 3名字空间#includeusing namespace std;namespace zhs namespace是画地为牢的做法表示这块地盘是我的,可以重新使用变量名int a=1;namespace lsint a=2;int main() coutls:aendl; return 0;#includeusing namespace std;namespace zhsclass aa;class zhs: aa 外定义,使namespace中的内容更清晰 public: aa(int a=1)id=a; int id;namespace zhs 也是张三,名字空间合并int age;double score=6;int main() zhs:aa a;定义了一个对象 zhs:score=90.5; couta.idzhs:scoreendl; int main() using namespace zhs; aa a; score=90.5; couta.idscoreendl;就不用再写zhs:和using namespace std一样int main() using zhs:score; using zhs:aa; aa a; score=90.5; couta.idscoreendl;自然也行int main() namespace zhsd 别名=zhs 已有的名字空间; zhsd: aa a; zhsd:score=90.5; couta.idzhsd:scoreendl;int main() namespace zhsd=zhs; zhs: aa a; coutzhs:a.idzhsd:scoreendl;报错:a不是zhs的成员,a是aa类的对象,该类是成员,但a就不是,正所谓我附庸的附庸,不是我的附庸1.2. 5行20个代码一Vectormax(20,);for(int i=0;in;i+)coutmaxendl;第一 Vectormax(20,);中是20个字符,而非变量,应为第二 想把vector整体输出,像把数组整体输出一样荒唐代码二for(int i=0;in;i+)for(int j=0;j20;j+)cout;coutendl;老式的C风格代码三。for(int i=0;in;i+)couta;for(int i=6,int j=1;i=0;i-,j=j+2)一定是逗号,且光j+2根本不行加了不存,j不会有任何改变的coutstring(i, );coutn;for(int i=0;in;i+)coutstr+n;对3. 把大写字母转成小写字母代码一vectorstr;char alph;while(cinalph)coutinput;str.push_back(alph); vector:iterator iter=str.begin();for(;iter!=str.end();iter+)*iter=toupper(*iter);cout*iter;结束时,在codeblocks中按ctrlZ即可结束,可见toupper只要是字母皆可,要是非小写字母就不变。代码二;int main()怎么可以不加括号,报错很诡异的 vector sevc;string alph;while(cinalph)coutinput;sevc.push_back(alph); vector:iterator iter=sevc.begin();iterator指向字符串for(;iter!=sevc.end();iter+) for(string:size_type index=0;index!=alph.size();index+)不是index!=alph.end()模板有end类只有size(*iter)index=toupper(*iter)index);一定要加括号cout*iter;直接输出类,不要一个个字母地输 return 0;4. string也有迭代器 string str(valiue is a fuck); string:iterator iter=str.begin(); for(;iter!=str.end();iter+) cout*iter;vector:iterator iter=vec.begin();你定义一个指针int *p=&avector:iterator相当于int*,可你没定义p *iter=(*iter)*2;4.vector的复制实验vectorvec1(2,a); vectorvec2(2,ab);要是vectorvec2(2, ab)那能行吗?字符串字符 vec1=vec2;错误,一个string型的,一个char型的复制不起来vectorvec1(1,a);可以 vectorvec2(b);是不行的v1 a v2 bb v2复制到v1结果bbV1 a v2 bb v1复制到v2结果a,全部复制,而非像C那样覆盖式复制可见vector的复制是全部的复制5. vector的比较实验1. 不同类型的vector不可比较2. 个数相同的数字型vector,看数值,如(4,0)小于(4,1)3. 个数不相同的,大小相同,数字型vector,看个数,如(4,1)小于(5,1)4. 大小数值皆不同的,看数值,如(4,2)大于(5,1)5. 字符型的按字典顺序5.Vector的sizevector:size_type a=vec.size();或int a=vec.size()皆可,输出vector元素个数6. String的复制实验也是全复制,str1(“str”),str2(“sr”),str1是sr 7. getline复制实验while(getline(cin,line)检验输入是否成功 coutlineline; coutline) coutline;输入 hello world输出 helloworld把iostream中的东西写进line10. reverse实验 用reverse要#include,且只可用于静态的,cin都不行自己做一个iterator只要倒过来遍历即可string line; cinline; string:iterator iter=line.end()-1; for(;iter=line.begin();iter-)!=不好使 cout*iter;11自己的头文件extern a;const int a=3;#ifndef SALESITEM_H#define SALESITEM_H 这个宏定义没什么意思,只是为了检验是否已经定义过SAL,从而决定要不要再定义一遍类,但声明可以放外面class foo;#endif#include定义了一个string类#include包含了#include,相当于定义了string类,没有这个机制,就会定义两遍11. pow函数,参数和返回值都必须是double的,否则有误差,还要include#include#include#includeusing namespace std;int main() ifstream cin(aaa.txt); double input; while(cininput) double result=pow(input,2.0); coutresultendl; return 0;全是int,差1,60的平方等于305912. 输入输出sales_item#includeusing namespace std; class Sales_item public: istream& input(istream& in); ostream& output(ostream& out); private: string isbn; unsigned units_sold; int revenue; unsigned price; ; istream& Sales_item:input(istream& in)istream类的 inisbnunits_soldprice; return in;返回流类,能检查状态 ostream& Sales_item: output(ostream& out) outisbntunits_soldt; return out; int main() Sales_item item; while(item.input(cin)调用两个函数 item.output(cout); coutendl; return 0; 函数中不能嵌套定义函数,就算是main函数中也不行#includeint main() void print() coutsdfg; return 0;错误13. 用this指针的场合,可以连续调用public函数,在函数中返回this指针#includeusing namespace std; class ty public: ty set(int i) a=i; couta; return *this; private: int a; ; int main() ty v; v.set(5).set(6); return 0;当你写了v.什么时就把它的地址传给了this指针,返回时返回的仍是它,注意不要把类写在函数里。18.友元函数/用友元实现实部虚部相加#includeusing namespace std;class number public: istream&in(istream& get); friend number sum(number one,number two); friend int main(); number():a(0),i(0)/一定要加构造函数,不然你所有的变量都是未定义的,而未定义可不是小问题,是通不过的,你说系统给我生成一个默认构造函数,那基本没用,默认的不会给局部变量赋值,你猜怎么着?在main函数中的也是局部变量!自动初始化规则:有构造函数的类,用构造函数初始化,全局变量初始化为0,局部变量未定义。 private: float a; float i;number sum(number one,number two)这个函数是友元函数,是兄弟,所以可以访问类的私有部分 number result; result.a=one.a+two.a; result.i=one.i+two.i; return result;istream& number:in(istream& get) getai;cin的符号要与cout的符号区分 return get;别忘了返回istreamint main() main函数也变成友元了 number one,two,result; one.in(cin); two.in(cin); result=sum(one,two); coutresult.aresult.i;21静态成员1.静态数据成员#includeusing namespace std;class Student public: static int a;静态数据成员在类内声明,类外初始化,要声明类型和变量名 Student& add()注意类函数与普通函数的区别,类函数有this指针,其他函数没有 a+; return *this; ;int Student:a=0;这是定义要写类型 void print(Student& ss) coutStudent:a; coutss.add().a;返回this指针的对象,可以连用int main() Student ss; print(ss);输出结果012.静态函数成员class Student private: static int a; public: int geta() return(a) ;int Student:a=0;int main() coutStudent:geta();不可以不通过对象调用函数 return 0;但是你要是写成Student aa;coutaa.Student:geta();这样意义就不大,所以静态函数成员应运而生class Student private: static int a; public: static int geta() return(a); ;int Student:a=0;int main() coutStudent:geta();可以直接用不必绑定对象aa.Student:geta();注意在main函数中调用类中的函数一定要写明是在那个类之中,要加作用域 return 0;静态成员函数不可以访问非静态数据成员class Student private: int a; public: static int geta() return(a);没有this指针,不可以访问a,谁知道它是谁的成员 Student():a(0);int main() coutStudent:geta(); return 0;静态成员函数不可以访问普通成员函数class Student private: int a; public: int geta() return(a); void print() coutgeta();在一个函数里访问另一个函数 Student():a(0);int main() Student aa; aa.Student:print(); return 0;输出结果0;static void print() coutgeta(); 即使调用print时写了 aa.Student:print();也没有用因为那个指针根本就没传给print函数,调用geta时根本没有对象万变不离其宗,非静态函数一定要绑定对象才能调用22.destructor ,constructor不管一个类有无数据成员,他都可以实例化,什么都没有都可以实例化呢1.des,cons一定是 public的,他们没有类型,不许绑定对象使用a.Student();/错误 void Student(); /错误 void Student();/错误 函数重载根本不关心返回的类型指针和引用不会激活构造函数14. Defalut constructor的使用无参数的constructorclass Sales_item public: Sales_item():units_sold(0),revenue(0.0) int return_units_sold() return units_sold; private: unsigned units_sold; double revenue; ; int main() Sales_item a;定义a时没有定义初始量,自动调用默认构造函数 int b;b=a.return_units_sold();一定要有括号,通过这样的方式来return units sold直接a.units_ sold 行不通,units_sold是私有的, coutb; 或couta.return_units_sold(); return 0;结果units_sold真的是0一定要定义默认构造函数#includeusing namespace std;/构造函数重载class Studentpublic: Student(string pName) cout pName endl; name = pName; Student(string pName,int i) cout pNamei; name = pName; semesHours=i; private: string name; int semesHours;int main() Student tt(Tom,60); Student ss(Jenny);Student t;只要你定义了构造函数,系统就不会给你生成默认的构造函数,结果T就没有定义了,用默认参数来代替默认构造函数class Studentpublic: Student(string pName=aa) cout pName endl; name = pName; Student(string pName=aa,int i) cout pNamei; name = pName; semesHours=i; private: string name; int semesHours;int main() Student tt(Tom,60); Student ss(Jenny);Student t;函数重载:1. 找候选函数:函数名与调用它的语句名字一样的,被列为候选函数2. 找可实行的函数:参数个数一样,默认参数可算可不算3. 找最佳函数:类型匹配,转换最少者为最佳可是以上的两个函数对调用来说都是最佳的,因此是模糊的#includeusing namespace std;/构造函数重载class Studentpublic: Student(string pName=aa,int i=60) cout pNamei; name = pName; semesHours=i; private: string name; int semesHours;int main() Student tt(Tom,60); Student ss(Jenny);Student t;这样可以避免默认构造函数T也被初始化了15. Constructor有参数的constructor改为 Sales_item(int a,int b):units_sold(a),revenue(b);int main() Sales_item a(4,5);这样是对的不会被认为是函数声明,因为他没有参数类型Sales_item a,构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来(显式)的调用它,而是 在建立对象时自动执行。Sales_item a;a. Sales_item(4,5) 显式调用构造函数,编译器不允许,反而是错的这时units_sold已经是4了,参数传递一样,初始化就是这么来的Sales_item a(7,8);错误,构造函数是在建立对象时有系统自动执行的,而且只执行一次, couta.return_units_sold(); return 0;20.流构造函数#includeusing namespace std;class ty int a,b; public: ty(istream& in); friend int main();main函数绝对不能少了括号,这是它是函数的证明,类型 函数名 参数列表;ty:ty(istream& in)在类外定义构造函数也可以,就在函数名前加上范围即可 inab;int main() ty c(cin);调用有参数的构造函数就这么写,先定义一个类再传递参数,之所以没有被认为是函数声明,是因为你没有写参数类型。 coutc.ac.b; return 0; 完全可以21.对象数组初始化对象数组,可以在构造函数中,用cin等完成#includeusing namespace std;class Number public: Number()num+;coutnumendl; Number()num-;coutnumendl; private: static int num;int Number:num=0;int main() Number*p=new Number5;当创建了一个类的数组时,就激活了构造函数,一个对象调用一个 coutWe diedn; delete p;return 0;不可以通过参数传递的方式,为动态数组初始化,因为动态数组的()中不许有参数,但是一般的对象如int *p=new int(7)允许有参数class Number public: Number(int p):num(p) int p=8默认参数可以 Number()num-;coutnumendl; private: int num;int main()Number*p=new Number5(8);不允许 coutWe diedn; delete p;return 0;error: parenthesized initializer in array new -fpermissive|为了解决不能传参数的问题,可以用指针数组,一个个分配student 空间,来传参数#includeusing namespace std;class Number public: static int number;Number() number+;Number() number-;int Number:number=0;class Studentpublic: Student(string p=Noname): name(p)private: Number num; string name;int main() int i; couti; Student*poi=new Student*i;动态创建了一个student指针数组,new返回指向该数组的首元素地址,给了poi,poi指向的是student指针,student指针指向student,因此poi是一个二级指针 for(int j=0;ji;j+) string temp; couttemp; poij=new Student(temp);之前创建的是student指针数组,而非student数组,所以要新创建,poij就是*(poi+j)即student的指针数组,每创建一个对象,就调用构造函数,new会激活构造函数 coutNumber:numberendl; for(int j=0;ji;j+) coutI graduaten; delete poij; coutNumber:numberendl; return 0;1.初始化的顺序#includeusing namespace std;class Student public: Student() coutStudent is conn; Student() coutStudent is desn;class Teacher public: Teacher() coutTeacher is conn; Teacher() coutTeacher is desn;class Tutor public: Tutor() coutTutor is conn; Tutor() coutTutor is desn; private: Student a; Teacher b;int main() Tutor d; coutback in mainn;被组合类先被构造,组合类后被构造,解构顺序与构造顺序相反,先把大的包装解构了,再解构小的2.在组合类中构造被组合类#includeusing namespace std;class StudentID public: StudentID(int numq=0):num(numq) coutStudentID is connnumendl; StudentID()coutnumdesn; int return_num() coutreturn num: numendl; private: int num; ;class Studentpublic: Student(string pname=sun,int a=0) coutStudent is conn; StudentID id(a); StudentID& return_id() StudentID& refer=id ; return refer; private: string pname; StudentID id;int main() coutmain is runningn; Student sun(sunyi,20); coutThis is very importantn; sun.return_id().return_num();接口 return 0;首先找到main函数入口,发现要组建student类,而student类是一个组合类,里面有studentID,所以先运行studentID的构造函数,再运行student的构造函数,所以是默认的参数0,而非20,然后执行student的构造函数,StudentID id(a);函数里面又创建了一个studentID对象,但他随着函数的终结也死亡了。且这个对象并非student的数据成员,它的值与对象孙毫无关系。从输出num为0,即可看出。组合类的访问权限不会发生改变,要想访问被组合类的数据成员,就要有接口。那么该如何初始化类的数据成员呢?用初始化列表,他的作用就是对数据成员进行初始化,可见放在构造函数的函数体中与放在初始化列表中的不同,除了先初始化再赋值的问题外,#includeusing namespace std;class StudentID public: StudentID(int num=0) coutnum; private: int num; ;class Studentpublic: Student(string pname=sun,int a=0):id(a) 注意id(a);一概不行,一律被认为是调用函数private: string pname; StudentID id;id也是他的数据成员,所以也可以在构造函数中初始化,调用id的构造函数创建id对象;int main() Student sun(sunyi,20); return 0;输出是20注意传参数时,并不是在代码执行的时候传参数,而是函数一开始时,就将参数复制到了栈中,参数的传递不依赖代码的执行,即使代码不执行,参数也照样传递,比如:#includeusing namespace std;class student public: student(int p=0):k(p) coutstudent is constructingn; coutpendl; student() coutstudent is desn; private: int k;class teacher public: teacher(int q=0):j(q) coutteacher is constructingn; coutqend

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论