From 368eda305fa067bddeb6e18685bd6942e807dc00 Mon Sep 17 00:00:00 2001 From: tracyxiong1 Date: Mon, 2 Jan 2023 20:39:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=9F=E4=B8=80=20cpp=20=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E7=BC=96=E7=A0=81=E6=A0=BC=E5=BC=8F=E4=B8=BA=20utf-8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../10_day_practice/day1/注释.cpp | 8 ++-- .../10_day_practice/day1/联合体学习.cpp | 4 +- .../10_day_practice/day10/文件例题/12-1.cpp | 8 ++-- .../10_day_practice/day10/文件例题/12-3.cpp | 2 +- .../10_day_practice/day10/文件例题/12-5.cpp | 6 +-- .../10_day_practice/day10/文件例题/12-6.cpp | 12 ++--- .../day10/文件例题/三种输入格式/get()12-2.cpp | 10 ++-- .../文件例题/三种输入格式/getline()12-2-2.cpp | 20 ++++---- .../day10/文件例题/重要!!!课堂练习.cpp | 16 +++---- .../10_day_practice/day2/掷骰子.cpp | 2 +- .../10_day_practice/day2/枚举类型.cpp | 2 +- .../10_day_practice/day2/汉诺塔.cpp | 2 +- .../10_day_practice/day2/递归2.cpp | 2 +- .../10_day_practice/day2/静态变量.cpp | 14 +++--- .../10_day_practice/day3/内联函数.cpp | 4 +- .../10_day_practice/day3/函数综合练习题.cpp | 24 +++++----- .../10_day_practice/day3/类前向声明.cpp | 22 ++++----- .../10_day_practice/day3/静态成员函数1.cpp | 8 ++-- .../10_day_practice/day3/静态成员函数2.cpp | 6 +-- .../10_day_practice/day3/静态数据成员.cpp | 14 +++--- .../day4/const用法/常对象与常引用.cpp | 4 +- .../day4/const用法/常对象与普通函数.cpp | 22 ++++----- .../day4/友元函数/友元模块.cpp | 8 ++-- .../10_day_practice/day4/友元函数/友元类.cpp | 10 ++-- .../day4/拷贝构造函数/clock.cpp | 6 +-- .../基类与派生类关系/基类与派生类(重要).cpp | 6 +-- .../day5/构造函数与析构函数/构造顺序.cpp | 6 +-- .../构造函数与析构函数/派生类构造函数.cpp | 2 +- .../派生类构造函数调用顺序.cpp | 2 +- .../派生类给基类传递参数.cpp | 2 +- .../day5/继承访问权限/保护成员.cpp | 16 +++---- .../day5/继承访问权限/保护继承.cpp | 20 ++++---- .../day5/继承访问权限/公有继承.cpp | 4 +- .../day5/虚拟继承/派生类初始化.cpp | 4 +- .../day5/虚拟继承/虚基类调用次序(重要).cpp | 2 +- .../day5/调用规则/直接基类与间接基类.cpp | 2 +- .../day6/纯虚函数和抽象类/抽象类.cpp | 10 ++-- .../day6/虚函数/虚函数例子.cpp | 26 +++++----- .../day6/虚函数/虚函数特性.cpp | 10 ++-- .../10_day_practice/day7/=号运算符/=例题.cpp | 8 ++-- .../day7/[]运算符/[]例题(重点).cpp | 26 +++++----- .../day7/二元运算符/1.类运算符重载.cpp | 10 ++-- .../10_day_practice/day8/STL/map_se.cpp | 14 +++--- .../day8/函数模板/模板特化.cpp | 14 +++--- .../day8/函数模板/求最大值.cpp | 12 ++--- .../10_day_practice/day8/函数模板/重要.cpp | 34 ++++++------- .../10_day_practice/day8/类模板/模拟栈.cpp | 14 +++--- .../day8/类模板/类模板特化.cpp | 6 +-- .../10_day_practice/day9/异常例子/2.cpp | 2 +- .../10_day_practice/day9/异常例子/4.cpp | 4 +- .../10_day_practice/day9/异常例子/7.cpp | 4 +- .../10_day_practice/day9/异常例子/8.cpp | 6 +-- .../10_day_practice/day9/异常例子/9.cpp | 4 +- .../key_exercises/字典插入与查找.cpp | 48 +++++++++---------- .../key_exercises/异常捕获.cpp | 4 +- .../key_exercises/时钟++运算符重载.cpp | 28 +++++------ .../key_exercises/类模板之栈.cpp | 4 +- .../key_exercises/类模板特化之数组.cpp | 2 +- .../key_exercises/继承与封装.cpp | 22 ++++----- .../key_exercises/读写文件综合题.cpp | 16 +++---- .../key_exercises/输入输出重载.cpp | 4 +- .../key_exercises/输出格式.cpp | 4 +- .../key_exercises/运算符重载之强制转换.cpp | 16 +++---- 63 files changed, 327 insertions(+), 327 deletions(-) diff --git a/practical_exercises/10_day_practice/day1/注释.cpp b/practical_exercises/10_day_practice/day1/注释.cpp index 90931ac..d5cbf60 100644 --- a/practical_exercises/10_day_practice/day1/注释.cpp +++ b/practical_exercises/10_day_practice/day1/注释.cpp @@ -1,16 +1,16 @@ #include -һָע +一种条件编译指令注释 -//һעͷ +//另一种注释方法 #if 0 asd #endif -//ע -//ָ +//打开注释 +//条件编译指令 #if 1 asData #endif diff --git a/practical_exercises/10_day_practice/day1/联合体学习.cpp b/practical_exercises/10_day_practice/day1/联合体学习.cpp index c0adee0..e5ba04e 100644 --- a/practical_exercises/10_day_practice/day1/联合体学习.cpp +++ b/practical_exercises/10_day_practice/day1/联合体学习.cpp @@ -1,6 +1,6 @@ #include using namespace std; -//ͬڴַ +//相同的内存地址 union myun { struct { int x; int y; int z; }u; @@ -11,7 +11,7 @@ int main() a.u.x =4; a.u.y =5; a.u.z =6; - a.k = 0; //ǵһintռֵ + a.k = 0; //覆盖掉第一个int空间值 printf("%d %d %d %d\n",a.u.x,a.u.y,a.u.z,a.k); system("pause"); return 0; diff --git a/practical_exercises/10_day_practice/day10/文件例题/12-1.cpp b/practical_exercises/10_day_practice/day10/文件例题/12-1.cpp index 2f1c9e4..3838863 100644 --- a/practical_exercises/10_day_practice/day10/文件例题/12-1.cpp +++ b/practical_exercises/10_day_practice/day10/文件例题/12-1.cpp @@ -1,4 +1,4 @@ -//cinַʱַкпհ׾Ͳ롣ΪհַʱcinΪַˡ +//用cin输入字符串数据时,如果字符串中含有空白就不能完整输入。因为遇到空白字符时,cin就认为字符串结束了。 #include using namespace std; int main(int argc, char const *argv[]) @@ -11,8 +11,8 @@ int main(int argc, char const *argv[]) return 0; } /* -aǣ +若a的内容是: this is a string! - -ӦijԱ +就难以输入啦! +这样的数据应用输入流类的成员函数输入 */ \ No newline at end of file diff --git a/practical_exercises/10_day_practice/day10/文件例题/12-3.cpp b/practical_exercises/10_day_practice/day10/文件例题/12-3.cpp index 1e314fe..8fa1969 100644 --- a/practical_exercises/10_day_practice/day10/文件例题/12-3.cpp +++ b/practical_exercises/10_day_practice/day10/文件例题/12-3.cpp @@ -1,6 +1,6 @@ #include using namespace std; -//ԭ +//函数原型 //put(char c) //write(const char*c, int n) int main(){ diff --git a/practical_exercises/10_day_practice/day10/文件例题/12-5.cpp b/practical_exercises/10_day_practice/day10/文件例题/12-5.cpp index 6c40322..edb386c 100644 --- a/practical_exercises/10_day_practice/day10/文件例题/12-5.cpp +++ b/practical_exercises/10_day_practice/day10/文件例题/12-5.cpp @@ -7,11 +7,11 @@ int main(){ double d=-1234.8976; cout<>name; while(!ioFile.eof()) { ioFile>>chinese>>math>>computer; diff --git a/practical_exercises/10_day_practice/day10/文件例题/三种输入格式/get()12-2.cpp b/practical_exercises/10_day_practice/day10/文件例题/三种输入格式/get()12-2.cpp index 99fe10a..af979ca 100644 --- a/practical_exercises/10_day_practice/day10/文件例题/三种输入格式/get()12-2.cpp +++ b/practical_exercises/10_day_practice/day10/文件例题/三种输入格式/get()12-2.cpp @@ -1,4 +1,4 @@ -//12-2 úgetgetlineȡݡ +//【例12-2】 用函数get和getline读取数据。 #include using namespace std; int main() @@ -14,8 +14,8 @@ int main() } /* -÷a = cin.get() ? ?cin.get(a) -ַ㹻س -˵ǵַ룬;һַASCALL뵽a -cinͬcin.get()ڻ[enter][space][tab]ΪǼڻ +用法:a = cin.get() ?或者 ?cin.get(a) +结束条件:输入字符足够后回车 +说明:这个是单字符的输入,用途是输入一个字符,把它的ASCALL码存入到a中 +处理方法:与cin不同,cin.get()在缓冲区遇到[enter],[space],[tab]不会作为舍弃,而是继续留在缓冲区中 */ \ No newline at end of file diff --git a/practical_exercises/10_day_practice/day10/文件例题/三种输入格式/getline()12-2-2.cpp b/practical_exercises/10_day_practice/day10/文件例题/三种输入格式/getline()12-2-2.cpp index e6e0cef..cda1d14 100644 --- a/practical_exercises/10_day_practice/day10/文件例题/三种输入格式/getline()12-2-2.cpp +++ b/practical_exercises/10_day_practice/day10/文件例题/三种输入格式/getline()12-2-2.cpp @@ -1,9 +1,9 @@ #include using namespace std; /* -1cin.getline(arrayname,size)cin.get(arrayname,size) -cin.get(arrayname,size)[enter]ʱĿǰ룬ɾе[enter] -cin.getline(arrayname,size)[enter]ʱǰ룬ǻɾе[enter] +(1)cin.getline(arrayname,size)与cin.get(arrayname,size)的区别 +cin.get(arrayname,size)当遇到[enter]时会结束目前输入,他不会删除缓冲区中的[enter] +cin.getline(arrayname,size)当遇到[enter]时会结束当前输入,但是会删除缓冲区中的[enter] */ int main() { @@ -12,27 +12,27 @@ int main() char b; cin.get(a,10); cin.get(b); - cout< #include -//һܹ͵Ķ̬ +//向量是一个能够存放任意类型的动态数组 #include #include using namespace std; @@ -25,20 +25,20 @@ class Person{ int main(int argc, char const *argv[]) { vector v; - vector::iterator pos;//һvectorãָvectorԪ + vector::iterator pos;//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素 char ch; ofstream out("d:/person.dat",ios::out|ios::app|ios::binary); char Name[20],ID[18],Addr[20]; int Age; - cout<<"------˵------"<>Name; - cout<<"֤ţ "; + cout<<"身份证号: "; cin>>ID; - cout<<"䣺 "; + cout<<"年龄: "; cin>>Age; - cout<<"ַ "; + cout<<"地址: "; cin>>Addr; Person per(Name,ID,Age,Addr); out.write((char*)&per,sizeof(per)); @@ -53,7 +53,7 @@ int main(int argc, char const *argv[]) v.push_back(s); in.read((char*)&s,sizeof(s)); } - cout<<"\n---------ļж--------"<>seed; srand(seed); int sum = rolldice(); diff --git a/practical_exercises/10_day_practice/day2/枚举类型.cpp b/practical_exercises/10_day_practice/day2/枚举类型.cpp index c2191a5..334531e 100644 --- a/practical_exercises/10_day_practice/day2/枚举类型.cpp +++ b/practical_exercises/10_day_practice/day2/枚举类型.cpp @@ -14,7 +14,7 @@ int main(int argc, char const *argv[]) { cout<>disks; hanoi(disks,'A','B','C'); diff --git a/practical_exercises/10_day_practice/day2/递归2.cpp b/practical_exercises/10_day_practice/day2/递归2.cpp index 79c3560..bf5e1b6 100644 --- a/practical_exercises/10_day_practice/day2/递归2.cpp +++ b/practical_exercises/10_day_practice/day2/递归2.cpp @@ -3,7 +3,7 @@ using namespace std; int f(int n, int k); int main(int argc, char const *argv[]) { - cout<<"nk"<>n; cin>>k; diff --git a/practical_exercises/10_day_practice/day2/静态变量.cpp b/practical_exercises/10_day_practice/day2/静态变量.cpp index be3bd0e..2fe4fbd 100644 --- a/practical_exercises/10_day_practice/day2/静态变量.cpp +++ b/practical_exercises/10_day_practice/day2/静态变量.cpp @@ -1,10 +1,10 @@ #include using namespace std; -int i=1; // i Ϊȫֱо̬ڡ +int i=1; // i 为全局变量,具有静态生存期。 int main(void) { - static int a; // ֲ̬ȫֲɼ - int b=-10; // b, cΪֲж̬ڡ + static int a; // 静态局部变量,有全局寿命,局部可见。 + int b=-10; // b, c为局部变量,具有动态生存期。 int c=0; void other(void); cout<<"---MAIN---\n"; @@ -21,10 +21,10 @@ void other(void) { static int a=2; static int b; - // a,bΪֲ̬ȫֲɼ - //ֻһν뺯ʱʼ - int c=10; // CΪֲж̬ - //ÿν뺯ʱʼ + // a,b为静态局部变量,具有全局寿命,局部可见。 + //只第一次进入函数时被初始化。 + int c=10; // C为局部变量,具有动态生存期 + //每次进入函数时都初始化。 a=a+2; i=i+32; c=c+5; cout<<"---OTHER---\n"; cout<<" i: "< using namespace std; -// +//函数声明 inline double CalArea(double radius); int main(int argc, char const *argv[]) { @@ -11,7 +11,7 @@ int main(int argc, char const *argv[]) system("pause"); return 0; } -//ӹؼinline +//加关键字inline inline double CalArea(double radius) { return 3.14*radius*radius; diff --git a/practical_exercises/10_day_practice/day3/函数综合练习题.cpp b/practical_exercises/10_day_practice/day3/函数综合练习题.cpp index d1d2a2d..1fb09f8 100644 --- a/practical_exercises/10_day_practice/day3/函数综合练习题.cpp +++ b/practical_exercises/10_day_practice/day3/函数综合练习题.cpp @@ -1,9 +1,9 @@ /* -һԲӾͼʾΧһԲ͹Χդդ۸Ϊ35Ԫ/ףΪ20Ԫ/ƽס -Ϊ3ףӾذ뾶ɼ롣Ҫ̼㲢դۡ +一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为35元/米,过道造价为20元/平方米。 +过道宽度为3米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。 -ͼԲǶСԲ -СԲڴԲм䣬СԲΪӾأԲСԲΪ +图形描述:大圆嵌套小圆: +小圆在大圆中间,小圆为游泳池,大圆与小圆间隔为过道。 */ #include using namespace std; @@ -25,13 +25,13 @@ Circle::Circle(float r) radius=r; } -// Բܳ +// 计算圆的周长 float Circle::Circumference() const { return 2 * PI * radius; } -// Բ +// 计算圆的面积 float Circle::Area() const { return PI * radius * radius; @@ -42,20 +42,20 @@ int main(int argc, char const *argv[]) float radius; float FenceCost, ConcreteCost; - // ʾû뾶 + // 提示用户输入半径 cout<<"Enter the radius of the pool: "; cin>>radius; - // Circle + // 声明 Circle 对象 Circle Pool(radius); Circle PoolRim(radius + 3); - // դ۲ + // 计算栅栏造价并输出 FenceCost = PoolRim.Circumference() * FencePrice; - cout << "Fencing Cost is " << FenceCost << endl; + cout << "Fencing Cost is ¥" << FenceCost << endl; - // ۲ + // 计算过道造价并输出 ConcreteCost = (PoolRim.Area() - Pool.Area())*ConcretePrice; - cout << "Concrete Cost is " << ConcreteCost << endl; + cout << "Concrete Cost is ¥" << ConcreteCost << endl; system("pause"); return 0; } diff --git a/practical_exercises/10_day_practice/day3/类前向声明.cpp b/practical_exercises/10_day_practice/day3/类前向声明.cpp index e2483b5..ffa33d4 100644 --- a/practical_exercises/10_day_practice/day3/类前向声明.cpp +++ b/practical_exercises/10_day_practice/day3/类前向声明.cpp @@ -1,31 +1,31 @@ /* -ʹǰȻԽһЩ⣬ܵġҪעǣ -ʹǰṩһ֮ǰĶ -ҲԱʹøĶ뿴ijΣ +使用前向引用声明虽然可以解决一些问题,但它并不是万能的。需要注意的是, +尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能声明该类的对象, +也不能在内联成员函数中使用该类的对象。请看下面的程序段: */ -//һ +//第一种 #include -class Fred; //ǰ +class Fred; //前向引用声明 class Barney { - Fred x; //Fredв + Fred x; //错误:类Fred的声明尚不完善 }; class Fred { Barney y; }; -//ڶ -class Fred; //ǰ +//第二种 +class Fred; //前向引用声明 class Barney { public: void method() { - x->yabbaDabbaDo(); //FredĶڶ֮ǰʹ + x->yabbaDabbaDo(); //错误:Fred类的对象在定义之前被使用 } private: - Fred* x; //ȷǰFredĶָ + Fred* x; //正确,经过前向引用声明,可以声明Fred类的对象指针 }; class Fred { @@ -36,5 +36,5 @@ class Fred { }; /* -ܽ᣺ʹǰʱֻʹñķţ漰κϸڡ +总结:当使用前向引用声明时,只能使用被声明的符号,而不能涉及类的任何细节。 */ \ No newline at end of file diff --git a/practical_exercises/10_day_practice/day3/静态成员函数1.cpp b/practical_exercises/10_day_practice/day3/静态成员函数1.cpp index 3edfa35..f99d2be 100644 --- a/practical_exercises/10_day_practice/day3/静态成员函数1.cpp +++ b/practical_exercises/10_day_practice/day3/静态成员函数1.cpp @@ -1,8 +1,8 @@ /* -֪ʶ㣺 -̬Ա -ʹþ̬Ա -̬Աֻڸľ̬ݳԱ̬Ա +知识点: +静态成员函数 +类外代码可以使用类名和作用域操作符来调用静态成员函数。 +静态成员函数只能引用属于该类的静态数据成员或静态成员函数。 */ #include using namespace std; diff --git a/practical_exercises/10_day_practice/day3/静态成员函数2.cpp b/practical_exercises/10_day_practice/day3/静态成员函数2.cpp index 168bb40..e999eb5 100644 --- a/practical_exercises/10_day_practice/day3/静态成员函数2.cpp +++ b/practical_exercises/10_day_practice/day3/静态成员函数2.cpp @@ -10,9 +10,9 @@ class A void A::f(A a) { - //̬Աֻڸľ̬ݳԱ̬Ա - // cout< using namespace std; @@ -17,7 +17,7 @@ public: void GetC() {cout<<" Object id="< #include using namespace std; @@ -13,9 +13,9 @@ class Point{ } friend float Distance(Point &a,Point &b); private: - int X,Y;//˽ݳԱ + int X,Y;//私有数据成员 }; -//ͨһģΪһģԪһģܹõһģбDZصϢ +//通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。 float Distance(Point &a, Point &b){ double dx = a.X-b.X; double dy = a.Y-b.Y; @@ -25,7 +25,7 @@ float Distance(Point &a, Point &b){ int main() { Point p1(3.0,5.0),p2(4.0,6.0); - cout<<"Ϊ"< using namespace std; /* -һΪһԪгԱܷʶԷ˽гԱ -﷨Ԫһʹfriend˵ +若一个类为另一个类的友元,则此类的所有成员都能访问对方类的私有成员。 +声明语法:将友元类名在另一个类中使用friend修饰说明。 */ /* -BAԪBijԱͿԷA˽кͱݣ -AijԱȴܷB˽Сݡ +如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据, +但A类的成员函数却不能访问B类的私有、保护数据。 */ class A{ friend class B; @@ -45,5 +45,5 @@ int main(int argc, char const *argv[]) } /* -BAԪBijԱͿԷA˽кͱݣAijԱȴܷB˽С +如果声明B类是A类的友元,B类的成员函数就可以访问A类的私有和保护数据,但A类的成员函数却不能访问B类的私有、保护数据 */ \ No newline at end of file diff --git a/practical_exercises/10_day_practice/day4/拷贝构造函数/clock.cpp b/practical_exercises/10_day_practice/day4/拷贝构造函数/clock.cpp index 702bf9e..355cb07 100644 --- a/practical_exercises/10_day_practice/day4/拷贝构造函数/clock.cpp +++ b/practical_exercises/10_day_practice/day4/拷贝构造函数/clock.cpp @@ -15,7 +15,7 @@ Clock::Clock(Clock &c) } void Clock::SetTime(int NewH,int NewM,int NewS) { - //Ӳthisָ붼һ + //加不加this指针都一样 this->Hour=NewH; this->Minute=NewM; this->Second=NewS; @@ -26,7 +26,7 @@ void Clock::ShowTime() cout<Minute<Second<setA(20); cout<getA()<getA()< class B @@ -19,16 +19,16 @@ class D: public B public: void f() { - i=1;//cannot access ಻ɷʻ˽гԱ - j=2;//ԷʻౣԱ + i=1;//cannot access 派生类不可访问基类私有成员 + j=2;//派生类可以访问基类保护成员 k=3; } }; int main() { B b; - b.i=1;//cannot access ˽гԱʹ߲ܷ - b.j=2; //cannot access Աʹ߲ܷ + b.i=1;//cannot access 私有成员,类的使用者不能访问 + b.j=2; //cannot access 保护成员,类的使用者不能访问 b.k=3; system("pause"); return 0; diff --git a/practical_exercises/10_day_practice/day5/继承访问权限/保护继承.cpp b/practical_exercises/10_day_practice/day5/继承访问权限/保护继承.cpp index a269f4e..0272779 100644 --- a/practical_exercises/10_day_practice/day5/继承访问权限/保护继承.cpp +++ b/practical_exercises/10_day_practice/day5/继承访问权限/保护继承.cpp @@ -1,7 +1,7 @@ /* -ʽΪprotectedļ̳гΪ̳Уּ̳зʽ£ -publicԱлprotectedԱ -protectedprivateԱбԭķȨ +派生方式为protected的继承称为保护继承,在这种继承方式下, +基类的public成员在派生类中会变成protected成员, +基类的protected和private成员在派生类中保持原来的访问权限 */ #include using namespace std; @@ -17,21 +17,21 @@ class Derived:protected Base{ int y; public: void sety(int n){ y=n; } - void sety(){ y=getx();} //ʻıԱ + void sety(){ y=getx();} //访问基类的保护成员 void showy(){ cout< using namespace std; class A { diff --git a/practical_exercises/10_day_practice/day5/调用规则/直接基类与间接基类.cpp b/practical_exercises/10_day_practice/day5/调用规则/直接基类与间接基类.cpp index ab06668..a31411f 100644 --- a/practical_exercises/10_day_practice/day5/调用规则/直接基类与间接基类.cpp +++ b/practical_exercises/10_day_practice/day5/调用规则/直接基类与间接基类.cpp @@ -1,4 +1,4 @@ -//ͬʱֱӻͼӻʱÿֱֻӻĹ졣 +//当同时存在直接基类和间接基类时,每个派生类只负责其直接基类的构造。 #include using namespace std; class A { diff --git a/practical_exercises/10_day_practice/day6/纯虚函数和抽象类/抽象类.cpp b/practical_exercises/10_day_practice/day6/纯虚函数和抽象类/抽象类.cpp index 7ee21ba..f733f01 100644 --- a/practical_exercises/10_day_practice/day6/纯虚函数和抽象类/抽象类.cpp +++ b/practical_exercises/10_day_practice/day6/纯虚函数和抽象类/抽象类.cpp @@ -13,21 +13,21 @@ class Figure{ class Trianle:public Figure{ public: void area(){ - cout<<""<area(); - // + //定义抽象类引用 Figure &rF=t; rF.set(20,20); rF.area(); diff --git a/practical_exercises/10_day_practice/day6/虚函数/虚函数例子.cpp b/practical_exercises/10_day_practice/day6/虚函数/虚函数例子.cpp index 1650141..589fafe 100644 --- a/practical_exercises/10_day_practice/day6/虚函数/虚函数例子.cpp +++ b/practical_exercises/10_day_practice/day6/虚函数/虚函数例子.cpp @@ -1,7 +1,7 @@ //Eg7-1.cpp -//ָָʱ,麯麯 -//EmployeeprintΪ麯ɷʵManagerprint麯ֻܷʵEmployeeprint +//基类指针或引用指向派生类对象时,虚函数与非虚函数区别: +//声明Employee的print为虚函数,则可访问到Manager的print函数,非虚函数,则只能访问到Employee的print #include #include using namespace std; @@ -30,7 +30,7 @@ float Employee::getSalary(){ return 0.0; } void Employee::print(){ - cout<<""<print(); @@ -63,4 +63,4 @@ int main(){ system("pause"); return 0; } -//VirtualؼʵǸ֪ϵͳָΪvirtualĺö̬ʽ롣 +//Virtual关键字其实质是告知编译系统,被指定为virtual的函数采用动态联编的形式编译。 diff --git a/practical_exercises/10_day_practice/day6/虚函数/虚函数特性.cpp b/practical_exercises/10_day_practice/day6/虚函数/虚函数特性.cpp index 8ee62f7..287243d 100644 --- a/practical_exercises/10_day_practice/day6/虚函数/虚函数特性.cpp +++ b/practical_exercises/10_day_practice/day6/虚函数/虚函数特性.cpp @@ -13,7 +13,7 @@ class C: public B { public: void f(int i){cout<<"C::f()"<f(1); //A::f - pB=&b; pB->f(1); //B::f - pB=&c; pB->f(1); //C::f - pB=&d; pB->f(1); //D::f + pA=&a; pA->f(1); //调用A::f + pB=&b; pB->f(1); //调用B::f + pB=&c; pB->f(1); //调用C::f + pB=&d; pB->f(1); //调用D::f system("pause"); return 0; } diff --git a/practical_exercises/10_day_practice/day7/=号运算符/=例题.cpp b/practical_exercises/10_day_practice/day7/=号运算符/=例题.cpp index b3e8d12..7b1ce0f 100644 --- a/practical_exercises/10_day_practice/day7/=号运算符/=例题.cpp +++ b/practical_exercises/10_day_practice/day7/=号运算符/=例题.cpp @@ -1,4 +1,4 @@ -//ch.cppi +//例题ch.cppi #include using namespace std; class X{ @@ -9,8 +9,8 @@ public: int main () { X obj1, obj2, obj3; - obj1 = obj2; //ء= - obj1.operator= (obj2); //ء= - obj1 = obj2 = obj3; //ء= + obj1 = obj2; //调用重载“=” + obj1.operator= (obj2); //调用重载“=” + obj1 = obj2 = obj3; //调用重载“=” system("pause"); } diff --git a/practical_exercises/10_day_practice/day7/[]运算符/[]例题(重点).cpp b/practical_exercises/10_day_practice/day7/[]运算符/[]例题(重点).cpp index 88a3d2a..77bc4f5 100644 --- a/practical_exercises/10_day_practice/day7/[]运算符/[]例题(重点).cpp +++ b/practical_exercises/10_day_practice/day7/[]运算符/[]例题(重点).cpp @@ -2,27 +2,27 @@ #include #include using namespace std; -struct Person{ //ְϢĽṹ +struct Person{ //职工基本信息的结构 double salary; char *name; }; class SalaryManaege{ - Person *employ; //ְϢ - int max; //±Ͻ - int n; //еʵְ + Person *employ; //存放职工信息的数组 + int max; //数组下标上界 + int n; //数组中的实际职工人数 public: SalaryManaege(int Max=0){ max=Max; n=0; employ=new Person[max]; } - double &operator[](char *Name) { //[] + double &operator[](char *Name) { //重载[],返回引用 Person *p; for(p=employ;pname,Name)==0) return p->salary; - // + //不存在情况处理 p=employ + n++; p->name=new char[strlen(Name)+1]; strcpy(p->name,Name); @@ -37,13 +37,13 @@ public: }; int main(){ SalaryManaege s(3); - s[""]=2188.88; - s["˹"]=1230.07; - s[""]=3200.97; - cout<<"\t"< using namespace std; class Complex { @@ -21,7 +21,7 @@ Complex Complex::operator -(Complex b) { return Complex(r-b.r,i-b.i); } -//˵㷨 +//求复数相乘的算法 Complex Complex::operator *(Complex b) { Complex t; @@ -29,7 +29,7 @@ Complex Complex::operator *(Complex b) t.i=r*b.i+i*b.r; return t; } -//㷨 +//求复数相除的算法 Complex Complex::operator /(Complex b) { Complex t; double x; @@ -48,8 +48,8 @@ void Complex::display(){ int main(void) { Complex c1(1,2),c2(3,4),c3,c4,c5,c6; Complex a,b(2,3); - a=b+2; //ȷ - // a=2+b; // + a=b+2; //正确 + // a=2+b; //错误 a.display(); c3=c1+c2; c4=c1-c2; diff --git a/practical_exercises/10_day_practice/day8/STL/map_se.cpp b/practical_exercises/10_day_practice/day8/STL/map_se.cpp index 6edc186..3943ebb 100644 --- a/practical_exercises/10_day_practice/day8/STL/map_se.cpp +++ b/practical_exercises/10_day_practice/day8/STL/map_se.cpp @@ -5,7 +5,7 @@ using namespace std; int main(int argc, char const *argv[]) { - string name[]={"","",""}; + string name[]={"张三","李四","王麻子"}; double salary[]={1200,2000,1450}; mapsal; map::iterator p; @@ -18,7 +18,7 @@ int main(int argc, char const *argv[]) cout<first<<"\t"<second<>person; int flag=1; for(p=sal.begin();p!=sal.end();p++) @@ -27,18 +27,18 @@ int main(int argc, char const *argv[]) flag=0; } if(flag) - cout<<"ûҵӦĽ"<>person; map::iterator it; it = sal.find(person); if(it!=sal.end()){ - cout<<"ҳɹ"<<(*it).first<<":"<<(*it).second<first<second< T Max(T a,T b) { return (a>b)?a:b; } -//ػ -//template <> <ػ>() {} +//特化 +//template <> 返回类型 函数名<特化的数据类型>(参数表) {} template<>char * Max(char *a,char *b) { return (strcmp(a,b)>=0)?a:b; } int main(){ float c=5.1,d=3.2; - cout<<"2,3ֵǣ"<b)?a:b; } /* -C++ʵģĹУֻǼ򵥵ؽģ滻ɵʵεͣԴģ庯в͵κת +C++在实例化函数模板的过程中,只是简单地将模板参数替换成调用实参的类型,并以此生成模板函数,不会进行参数类型的任何转换。 */ int main(){ double a=2,b=3.4; float c=5.1,d=3.2; - //ģʱв͵ǿת - cout<<"2, 3.2 ֵǣ"<('a',3)<('a',3)< -//עһ㣬maxminʹõʱͻдһд룬Ҫı亯ģֱ֣ʹstd::coutstd::endl +//注意一点,max与min使用的时候,容易引起冲突,如果写了下面这一行代码,则要改变函数模板名字,否则直接使用std::cout与std::endl using namespace std; /* -ҪclassؼclassһȻͬĸɣDzͬġ -classʾTһͲκͣintfloatcharȣûstructenumclassԶ͡ +不要把这里的class与类的声明关键字class混淆在一起,虽然它们由相同的字母组成,但含义是不同的。 +这里的class表示T是一个类型参数,可以是任何数据类型,如int、float、char等,或者用户定义的struct、enum或class等自定义数据类型。 */ template T Min(T a,T b) { return (aдʽȫȼ۵ģ +为了区别类与模板参数中的类型关键字class,标准C++提出?了用typename作为模板参数的类型关键字,同时也支持使用class。 +比如,把min定义的template 写成下面的形式是完全等价的: */ template T myMin(T a, T b){ @@ -20,22 +20,22 @@ T myMin(T a, T b){ } /* -ģʵڵģ庯ʱжԺģĵʱ -Żݵʵεľͣȷģͣ -ô滻ģеģܹ͵ĺ룬ģ庯 -ηͬIJʱֻڵ1νʵֻڵ1εʱģ庯 -֮ͬ͵IJʱģ庯õ1ʵɵģ庯 +模板实例化发生在调用模板函数时。当编译器遇到程序中对函数模板的调用时, +它才会根据调用语句中实参的具体类型,确定模板参数的数据类型, +并用此类型替换函数模板中的模板参数,生成能够处理该类型的函数代码,即模板函数。 +当多次发生类型相同的参数调用时,只在第1次进行实例化。编译器只在第1次调用时生成模板函数, +当之后遇到相同类型的参数调用时,不再生成其他模板函数,它将调用第1次实例化生成的模板函数。 */ int main(){ double a=2,b=3.4; float c=2.3,d=3.2; - cout<<"23 Сֵǣ"<(2,3)<(2,3)< using namespace std; @@ -32,14 +32,14 @@ class Stack{ } }; /* -ԭͣ -template <ģб> -ֵ ģ<ģ>::Ա (б){}; +原型: +template <模板参数列表> +返回值类型 类模板名<模板参数名表>::成员函数名 (参数列表){}; */ template void Stack::push(T e){ if(full()){ - cout<<"ջԪˣ"; + cout<<"栈已满,不能再添加元素了!"; return; } elem[++top]=e; @@ -48,7 +48,7 @@ void Stack::push(T e){ template T Stack::pop(){ if(empty()){ - cout<<"ջѿգٵԪˣ"<::pop(){ int main(int argc, char const *argv[]) { - //ģʵ + //类模板实例化 Stack iStack; Stack cStack; iStack.setEmpty(); diff --git a/practical_exercises/10_day_practice/day8/类模板/类模板特化.cpp b/practical_exercises/10_day_practice/day8/类模板/类模板特化.cpp index 3d84935..cd520e5 100644 --- a/practical_exercises/10_day_practice/day8/类模板/类模板特化.cpp +++ b/practical_exercises/10_day_practice/day8/类模板/类模板特化.cpp @@ -1,4 +1,4 @@ -//һֱܹͨ࣬ӴȡԪأܹдӴС +//设计一通用数组类,它能够直接存取数组元素,并能够对数组进行从大到小的排序。 #include #include @@ -20,7 +20,7 @@ class Array{ template T& Array::operator[](int i){ if(i<0||i>Size-1){ - cout<<"\n±Խ磡"< void Array::Sort(){ a[i]=t; } } -//template <> ģ<ػ>::ػԱ(){} +//template <> 返回类型 类模板名<特化的数据类型>::特化成员函数名(参数表){} template<> void Array::Sort(){ int p; for(int i=0;i using namespace std; const int MAX=3; -class Full{}; //L1 ջʱ׳쳣 -class Empty{}; //L2 ջʱ׳쳣 +class Full{}; //L1 堆栈满时抛出的异常类 +class Empty{}; //L2 堆栈空时抛出的异常类 class Stack{ private: int s[MAX]; @@ -26,7 +26,7 @@ int main(){ Stack s; try{ s.push(10); s.push(20); s.push(30); - //s.push(40); //L5 ջ쳣 + //s.push(40); //L5 将产生栈满异常 cout<<"stack(0)= "< + //pair插入 mp.insert(pair(key[2],value[2])); - //뷽ʽ - mp["addr"]="й"; - //ȡԪ - //ѭȡԪ + //数组插入方式 + mp["addr"]="中国"; + //迭代器取出元素 + //循环取出元素 for(iter=mp.begin();iter!=mp.end();iter++){ cout<first<<"\t"<second<first,key1)==0){ - cout<first<<"ҳˣ"<<"ӦֵΪ"<second<first<<"查找出来了!"<<"对应的值为:"<second<first<<"keyҳˣ"<<"ӦvalueΪ"<second<first<<"按照key查找出来了!"<<"对应的value为:"<second<first,drop_key)==0){ - cout<first<<"keyҳˣ"<<"ӦvalueΪ"<second<first<<"按照key查找出来了!"<<"对应的value为:"<second<second,drop_value)==0){ - cout<second<<"valueҳˣ"<<"ӦkeyΪ"<first<second<<"value查找出来了!"<<"对应的key为:"<first<first<<"\t"<second< using namespace std; -//쳣׳ȥ +//函数异常可以抛出去由主函数来处理 void fun(int x){ try{ if (x==0) - throw "쳣"; + throw "异常"; }catch(...){ cout<<"in fun"< void Stack::push(T e){ elems[++top]=e; } else{ - cout<<"ջ벻ҪټԪأ"; + cout<<"栈已满,请不要再加入元素!"; return; } } @@ -44,7 +44,7 @@ template T Stack::pop(){ return elems[top--]; } else{ - cout<<"ջѿգ벻ҪٵԪأ"; + cout<<"栈已空,请不要再弹出元素!"; return 0; } } diff --git a/practical_exercises/key_exercises/类模板特化之数组.cpp b/practical_exercises/key_exercises/类模板特化之数组.cpp index 6e768a1..6844d7f 100644 --- a/practical_exercises/key_exercises/类模板特化之数组.cpp +++ b/practical_exercises/key_exercises/类模板特化之数组.cpp @@ -21,7 +21,7 @@ class Array{ template T& Array::operator[](int i){ if(i<0||i>MAXSIZE-1){ - cout<<"±Խ磡"<>week; - Manager m("С","11111111",week); + Manager m("小王","11111111",week); m.display(); - cout<<""; + cout<<"请输入销售利润:"; int profit; cin>>profit; - cout<<"ۼ"; + cout<<"请输入销售件数:"; int x; cin>>x; - SaleWorker s("С","222222",profit,x); + SaleWorker s("小李","222222",profit,x); s.display(); - cout<<"빤Сʱ"; + cout<<"请输入工作小时:"; int hour; cin>>hour; - HourWorker h("С","333333",hour); + HourWorker h("小何","333333",hour); h.display(); system("pause"); return 0; diff --git a/practical_exercises/key_exercises/读写文件综合题.cpp b/practical_exercises/key_exercises/读写文件综合题.cpp index fd3f7c7..003fd08 100644 --- a/practical_exercises/key_exercises/读写文件综合题.cpp +++ b/practical_exercises/key_exercises/读写文件综合题.cpp @@ -36,21 +36,21 @@ int main(int argc, char const *argv[]) int Math,Chinese,English; fstream ioFile; ioFile.open("d:/per.dat",ios::out|ios::app); - cout<<"---------ѧϢ----------\n"; + cout<<"---------建立学生档案信息----------\n"; do{ - cout<<""; + cout<<"请输入姓名:"; cin>>Name; - cout<<"֤ţ"; + cout<<"请输入身份证号:"; cin>>Id; - cout<<"ѧɼ"; + cout<<"请输入数学成绩:"; cin>>Math; - cout<<"뺺ɼ"; + cout<<"请输入汉语成绩:"; cin>>Chinese; - cout<<"Ӣɼ"; + cout<<"请输入英语成绩:"; cin>>English; Person per(Name,Id,Math,Chinese,English); ioFile.write((char *)&per,sizeof(per)); - cout<<"Ƿ(Y/y) "; + cout<<"您是否继续建档?(Y/y) "; cin>>ch; }while(ch=='y'||ch=='Y'); ioFile.close(); @@ -64,7 +64,7 @@ int main(int argc, char const *argv[]) ioFile.read((char*)&p,sizeof(p)); } ioFile.close(); - cout<<"---------Ϣ-----------"<>(istream&is,Sales &s){ - cout<<"Ա֤䣺\n"; + cout<<"输入雇员的姓名,身份证,年龄:\n"; is>>s.name>>s.id>>s.age; } int main(int argc, char const *argv[]) { - Sales s("","15611",26); + Sales s("张三","15611",26); cout<>s; cout<