练习一
知识点1
- const 修饰符 (用来表示常量, 不允许修改的值)
- 与 C语言中的 #define 作用相同, 均为定义常量, 但 const 更灵活, 安全性更高
- 支持基本数据类型的常量定义
- 特点:
- 不允许在任何地方进行修改
- 优于 #define 的形式
- 作为参数时, 可保证实参不会被改动/破坏 ( 编译时会提示你错误,导致整个程序无法运行)
- 特点:
- 支持基本数据类型的常量定义
- 可以与指针一起使用:
- 指向常量的指针
const char* pc = "abcd"; // 指向常量的指针- 含义: 声明了一个名为 pc 的指针变量, 指向的是字符型常量
- 也就是你不能改变字符串本身的值
- 即: 不可以使用数组方式将其中的某个字符换掉
pc[2] = "c";
- 即: 不可以使用数组方式将其中的某个字符换掉
- 但是你可以把它整体都换了
- 即:
pc = "efgh";
- 即:
- 也就是你不能改变字符串本身的值
- 通俗来讲:
- 你开垦了一个荒地, 里面已经种上了草莓, 你又想种西瓜了, 但是草莓还没熟, 你总不能把草莓毁了, 种西瓜吧.😂
- 常指针 (与上面相反, 地址不能变)
char* const pc = "abcd";- 含义: 声明了一个名为 pc 的指针变量, 指向的是字符型数据的常指针
- 也就是你可以改变字符串本身的值
- 即: 使用数组方式将其中的某个字符换掉
pc[2] = "c";
- 即: 使用数组方式将其中的某个字符换掉
- 但是你不可以把它整体的地址都换了
- 即: 不可以
pc = "efgh";
- 即: 不可以
- 也就是你可以改变字符串本身的值
- 通俗来讲:
- 你只有一块土地, 里面已经种上了草莓, 你又想种西瓜了, 地里只能种一种水果, 所以你只能把草莓毁了,来 种西瓜.😂
- 指向常量的常指针
const char* const pc = "abcd";- 含义: 声明了一个名为 pc 的指针变量, 指向的是字符型常量的常指针
- 即上述两种情况的不允许操作的行为的集合
- 不允许通过数组改变原字符型数据本身的某一个或多个值
- 不允许更改整体的地址
- 可以与指针一起使用:
解析:
char* 后有const , char 前没有, 所以不能修改指针地址, 但可以通过数组修改其中的内容, 所以选 A
1.3

char* 后没有const , char 前有, 所以只能修改指针地址, 不可以通过数组修改其中的内容, 所以 A 是错的
- B : 为把整体修改了 (字符型数据在初始化时自动会开辟了一个地址供自己使用)
- C D : new 即为开辟了一个多大的空间
1.4

练习二
知识点2
- 重载函数:
- 即: 两个或两个以上的函数, 函数名相同, 返回参数相同, 参数不同的函数 ( 同名不同参 )
- 详情:【作业题目篇1-2】中的代码:
- 即: 两个或两个以上的函数, 函数名相同, 返回参数相同, 参数不同的函数 ( 同名不同参 )
- 内联函数
- 关键字:inline
- 作用:
- 在编译时, 自动将内联函数替换掉函数调用处, 消除函数调用时的系统开销, 提高运行速度(容易理解层面去讲就是不需要系统再去找这个函数, 并传递进去)
- 使用内联函数前:

- 使用内联函数后:

- 使用内联函数前:
- 在编译时, 自动将内联函数替换掉函数调用处, 消除函数调用时的系统开销, 提高运行速度(容易理解层面去讲就是不需要系统再去找这个函数, 并传递进去)
默认参数值的函数
-
练习三
知识点3
new / delete
- 作用: 动态内存管理 (开辟 / 销毁)
- 基本格式:
指针变量名 = new 类型;// 为指针动态分配存储空间delete 指针名;// 释放指针的存储空间
- 示例:

- 为数组分配空间的方式
- 限定分配空间的个数:
int *pc = new int[分配空间个数]; - 分配空间并进行初始化:
int *pc = new char('c'); - 注意⚠️: 无法同时 既限定空间个数还能初始化的方式
- 例题:
- 限定分配空间的个数:
- PS注意⚠️:
- 显式分配( new )的空间, 需要显式释放( delete )该空间; 否则这部分空间将无法被回收
- 当没有足够的空间分配时, 将返回 NULL, 所以通常要对其进行是否分配成功进行检查
- 可以为数组动态分配空间
- 引用 &
- 详见 作业题目篇1-1
- 作用域运算符 :: ( 解决变量同名但处于不同范围的问题 )
- 作用:
- 使用某个类中的静态变量 ( 只有静态变量才可以使用
类名::变量名获取)
- 使用某个类中的静态变量 ( 只有静态变量才可以使用
- 在类外定义类内已经声明了的函数
返回类型 类名::函数名(参数列表){...}
- 在类外定义类内已经声明了的函数
- 使用全局变量(即定义在最外面)
::变量名
- 使用全局变量(即定义在最外面)
- 示例:

- 运行结果:

- 作用:
强转
友元函数和友元类 -> 详情 作业题目篇 4-1
- 静态成员:


==================================
- 构造函数不能是虚函数
-
多态练习
动态指针
虚函数与普通函数在多态的向上转型面前的使用
#include <iostream>using namespace std;class Family{public:virtual void like(){cout<<"每个家人都喜欢不一样的花"<<endl;}void show(){cout<<"温馨和睦的家庭..."<<endl;}};class Mother : public Family{public:Mother(string f):flower(f){}void like(){cout<<"妈妈喜欢"<<this->getFlower()<<endl;}void show(){cout<<"妈妈❤️这个家庭..."<<endl;}string getFlower(){return this->flower;}private:string flower;};class Father : public Family{public:Father(string f):flower(f){}void like(){cout<<"爸爸喜欢"<<this->getFlower()<<endl;}string getFlower(){return this->flower;}void show(){cout<<"爸爸❤️这个的家庭..."<<endl;}private:string flower;};int main(){// 分别对三个类创建三个对象Family b,*ptr;Mother m("玫瑰");Father f("菊花");// 将基类指针指向基类Familyptr = &b;ptr->like(); // 指针调用虚函数时(下面的雷同)ptr->show(); // 指针调用普通成员函数时(下面的雷同)// 将派生类妈妈的地址给基类指针ptr = &m;ptr->like();ptr->show();// 将派生类爸爸的地址给基类指针ptr = &f;ptr->like();ptr->show();return 0;}
看到这里, 你认为的输出结果是什么呢?
- 答案:
- 解析:
- 这就是动态指针与多态的问题:
- 对于普通函数
show(), 将派生类的地址给基类指针ptr = &m;, 基类使用时会找到自身的实现方法ptr->show(), 完成输出 - 而对于虚函数
like(), 将派生类的地址给基类指针ptr = &m;, 该指针判断自己当前基类的函数是不是虚函数, 如果是那么自动向下寻找也就是谁给了我这个地址, 我就找这个派生类的函数like()并完成输出- 例如本题中, 妈妈将自身派生类的地址给了基类指针 ptr, ptr发现自己的like()函数是virtual的, 那么就去找Mother中的like()并完成输出
- 看完这些, 那么就看看这个题吧

- 此刻你应该知道输出什么了吧?
- 答案:
#include<iostream>using namespace std;const double PI = 3.1415;class Shape{public:virtual void ShowArea()=0; // 纯虚函数};class Circle:public Shape{public:Circle(double r):radius(r){}void ShowArea(){cout<<"圆形的面积为:"<< PI * radius * radius <<endl;}private:double radius;};class Square:public Shape{public:Square(double sw):width(sw){}void ShowArea(){cout<<"方形的面积为:"<< width * width <<endl;}private:double width;};class Triangle:public Shape{public:Triangle(double w,double h):width(w),height(h){}void ShowArea(){cout<<"三角形的面积为:"<< 0.5 * width * height<<endl;}protected:double width,height;};int main(){Shape *ptr; // 创建一个Shape指针// 创建三个派生类对象Circle circle(3.0);Square square(3.0);Triangle triangle(3.0,3.0);// 将指针指向圆形ptr = &circle;ptr->ShowArea();// 将指针指向方形ptr = □ptr->ShowArea();// 将指针指向三角形ptr = ▵ptr->ShowArea();return 0;}
-
判断下列代码的错误

修改后的代码:
#include<iostream>using namespace std;template<typename T>class Compare{public:Compare(T a,T b){x = a;y = b;}T min(){return (x < y) ? x : y;}private:T x,y;};int main(){Compare <int> com1(3,7);cout<<"其中的最小值是:"<<com1.min()<<endl;return 0;}
错误点:













