字符和字符串
‘A’ 字符
“A” 字符串
算法
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一个指令
表示一个或多个操作
2)算法的特性
①有穷性
一个算法必须保证有限步之后结束
②确定性
算法中每一条指令必须有确切的含义
③可行性
算法中所有操作都必须通过已经实现的操作进行运算
④输入
一个算法有0个或多个输入
⑤输出
一个算法有一个或多个输出
静态成员的声明的定义
在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样。
class A
{
private:
static int count ; // 类内声明
};
int A::count = 0 ; // 类外初始化,不必再加static关键字
因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
能在类中初始化的成员只有一种,那就是静态常量成员。
此外,还需要注意的是声明和定义的区别:
①变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
②变量声明:用于向程序表明变量的类型和名字。
虚函数调用
#include <iostream>
using namespace std;
class Base {
public:
void virtual Func() {
cout << "Base" << endl;
}
};
class Derived : public Base {
public:
void virtual Func() {
cout << "Derived " << endl;
}
};
int main() {
Base* pBase = new Base();
pBase->Func();
Derived* pDerived = (Derived*)pBase;
pDerived->Func();
delete pBase;
pDerived = new Derived();
pBase = pDerived;
pBase->Func();
delete pDerived;
return 0;
}
输出:
Base Base Derived
没有生成新的对象,调用的还是基类的函数
可重载与不可重载
构造函数可以重载,析构函数不能重载。
如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字,此时,基类的函数被隐藏,注意,是隐藏而不是覆盖。覆盖的基本特征之一就是 基类函数必须有virtual关键字。
基类 | 派生类 | |
基类重载函数有virtual | 函数覆盖 | |
基类重载函数无virtual | 函数隐藏 |
重载,覆盖和隐藏再总结:
1.重载:函数名相同,参数列表不同,重载只是在类的内部实现,但是不能靠返回值来判断。
特点:(1)相同的范围;(2)函数名字相同;(3)参数不同;(4)virtual可有可无。
2.覆盖:子类重新定义父类中相同名称和参数的虚函数,函数特征相同,但是具体实现不同,主要是在继承关系中出现。
特点:(1)不同的范围,分别位于父类和子类中;(2)函数的名称相同;(3)参数相同;(4)基类必须有virtual。
3.隐藏:也叫重定义,是指子类屏蔽了父类与其同名的函数。
特点:(1)如果子类的函数和父类的函数同名,但是参数不同,此时,不管有无virtual,父类的函数被隐藏。
(2)如果子类的函数和基类的函数同名,参数也相同,若基类无virtual,则父类函数被隐藏,若有就是覆盖
抽象类
抽象类是指含有纯虚函数的类
抽象类只可以作为基类使用,纯虚函数的实现只靠派生类使用
static和const
static 改变变量的性质 全局静态变量 不会随函数的结束而释放内存
#include <stdio.h>
int fun(int a) {
int b = 0;
static int c = 3;
b++;
c++;
return (a + b + c);
}
int main() {
int i=0;
for(; i < 3; i++)
printf("%d",fun(2));
return 0;
}
输出:
789
func(2) 一共被执行了 3 次。func 函数中 c 为全局变量,全局变量只会赋值一次,并且不会随函数结束而释放。
第一次调用时 b 为 0 然后自增为 1,a 为 2,c 为 3 然后自增为 4,因此返回 2+1+4。
第二次调用时 b 为 0 然后自增为 1,a 为 2,c 为 4然后自增为 5,因此返回 2+1+5。
第三次调用时 b 为 0 然后自增为 1,a 为 2,c 为 5 然后自增为 6,因此返回 2+1+6。
因此输出为 789