static**:用来说明是静态变量
特点:
1.如果是在函数外面定义的,那么效果和全局变量类似,但static定义的变量只能在当前的C文件中使用
2.如果是在函数内部定义的,那么这个变量只初始化一次
const:
const 常量类型 常量名=常量表达式;(固定不变)
int const等同于const int
malloc和free:
new和delete:
new:开辟一个存储空间
delete:撤销new建立的存储空间,防止内存泄漏。
try和throw:
stlen()和str():
析构函数的调用顺序:
先构造的后析构,后构造的先析构。相当于栈的先进后出
拷贝构造函数:
CExample(const CExample& C) 就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量**。
https://www.cnblogs.com/alantu2018/p/8459250.html
friend:友元,给予函数访问私有部分内容的权限
例子:friend int f(A&f1,B&f2)
引用:等同于取别名
例:
1 | void f(int *a,int *b) |
上面这个例子可以看出&a要跟 *a配合使用,若主函数中调用f()不写&a,而是写成a的话,那么只有在f()这个函数里变量a,b才会改变,等到执行完这个子函数f()后,值又会重新变为刚输入f()子函数时的数值。(即:在f()函数中其实是形参a,b发生了改变,而实参a,b并没有变化)
为什么当子函数格式为:void f(int *a,*b)时,在调用子函数的输入一定要为f(&a,&b)呢?
原因是:引用得到的是地址,当子函数用指针来接收地址时,函数中的a,b发生变化时,被引用的值同时也发生变化,不会受到函数声明周期的影响。
C++中:参数传递的方法是想“实虚结合”
- 按值传递:调用函数本身,不对实参进行操作,即使形参值发生改变,实参的值仍然不变;
- 地址传递:形参为指针,实参跟着形参发生改变;例:f(a,b);void f(&a,&b);
- 引用传递:引用得到的是地址,相当于输入的是地址,子函数用指针来接收地址;例:f(&a,&b);void f(*a,*b)
函数的重载:
1 | 例:同时定义这三个函数void f(int x),void f(float x), void f(double x) |
从上面看;:这就是重载。即:定义的函数名字相同,但是输入参数的类型不同
运算符的重载:
运算符重载的基本原则:
格式:如operator+()必须是有效的C++运算符。
- 不能虚构运算符,如operator@()
- 重载后的运算符至少要有一个操作数是用户自定义的类型不能违反运算符原来的句法规则,如取模%不能重载成使用操作数
- 不能修改运算符的优先级
继承方式:
分为:公用继承、私有继承、受保护继承
特点:
- 无论是什么方式的继承,都只继承基类的公用成员和保护成员,而私有成员、构造函数、析构函数都是不被继承的;
- 公用继承不改变访问属性;
- 私有、受保护继承则根据继承方式,将从基类继承过来的成员的访问属性全改为对应的继承方式;
注:保护成员:不能被外界引用,但可以被派生类的成员引用.(派生类:通过继承方式,新的类可以从已有的类中派生。那么用于派生的类统称为这个派生类的“基类”)
注:若是调用时不写继承方式,则默认为私有继承哦。
当存在继承关系时,执行的顺序为:
虚函数:
定义:被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性。(多态性:是将接口与实现进行分离;简单来讲就是实现以共同的方法,但因个体差异,而采用不同的策略。)
1 | 例1: |
假如不声明为虚函数会怎样呢?
答:如果不声明为虚函数,那么试图通过基类指针调用派生类的非虚函数是不行的。如果非要这样写,那么输出的结果就是11111111111。
为什么会这样呢?
答:因为:基类指针是用来指向基类对象的,如果用它指向派生类对象,则自动进行指针类型转换,将派生类的对象的指针先转换为基类指针对象,这样,基类指针指向的是派生类对象中的基类部分,所以不声明为虚函数的话,是没法执行派生类中相同函数名的函数的。我的理解是:virtual这个关键字是要告诉编译器在派生类中还可能存在着相同函数名的函数,使得基类指针去往派生类中寻找。