2021.4.14牛客刷题小结
前言
以下内容仅供参考。
C++
1、重载和重写
方法的重载:
定义:同一个类或与他的派生类中,方法名相同,而参数列表不同的方法。其中参数列表不同指的是参数的类型,数量,类型的顺序这三种至少有一种不同。
方法重载与下列无关:
1、与 返回值类型 无关;
2、与 访问修饰符 无关
重载的判定只有两个条件:
1、方法名一致。
2、形参列表不同。
重载是多态在编译期的表现形式。
构造方法也可以重载
方法的重写(覆盖):
定义:重写在方法运行时,通过调用者的实际类型来确定调用的方法版本。(具体来说,就是子类中重写方法在对应的class文件常量池的位置相同,一旦子类没有重写,那么子类的实例就会沿着这个位置往上找,直到找到父类的同名方法)。
特点:
1、重写只发生在可见的实例方法中。
2、私有方法也不存在重写,父类中private的方法,就算子类定义了也只相当于一个新方法。
3、静态方法和实例方法不存在相互重写。
4、重写满足规则:
1、两同:方法名和形参列表一致。
2、两小:重写的方法返回值(引用类型)和抛出异常,要和被重写方法的返回值和抛出异常相同或者是其子类。
注意,一旦返回值是基本数据类型,那么重写方法和被重写方法必须相同。
3、一大:重写的访问修饰符大于被重写方法的访问修饰符。
方法重写的注意事项:
构造方法不能被重写,不要问为什么?因为构造方法名必须和类名相同
private修饰的成员方法不能被重写
static修饰的方法不能被重写
final修饰的方法不能被重写
当子类重写了父类中的方法后,子类对象调用该方法时调用的是子类重写后的方法
2、enum枚举类型结构体
#include <iostream>
using namespace std;
typedef enum
{
Char ,
Short,
Int,
Double,
Float,
}TEST_TYPE;
int main() {
TEST_TYPE val;
cout<< sizeof(val)<<endl;
return 0;
}
枚举类型,指一个被命名的整型常数的集合。
即枚举类型,本质上是一组常数的集合体,只是这些常数有各自的命名。枚举类型,是一种用户自定义数据类型。
枚举变量,由枚举类型定义的变量。枚举变量的大小,即枚举类型所占内存的大小。由于枚举变量的赋值,一次只能存放枚举结构中的某个常数。所以枚举变量的大小,实质是常数所占内存空间的大小(常数为int类型,当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节),枚举类型所占内存大小也是这样。
3、数组越界
int main ()
{
int i,a[5];
for (i=0;i<=30;i++)
{
a[i]=0;
printf("%d:hello\n",i);
}
printf("%d:hello world",i);
return 0;
}
输出结果为: 多行的 i:hello (i∈[0,30] )
i的地址与a[5]的地址相同,因此循环到i=5时,i的值会被修改,于是造成死循环。
这里与声明的顺序有关。从右往左定义。
int main(void) {
int i,a[5];
cout<<"&i = "<<&i<<endl;
cout<<"&a[0] = "<<&a[0]<<endl;
cout<<"&a[5] = "<<&a[5]<<endl;
return 0;
}
输出:
&i = 0x61ff0c
&a[0] = 0x61fef8
&a[5] = 0x61ff0c
4、 Math.floor(x)函数
返回小于等于x的最接近整数,类型为double
5、子类构造函数
template<class T> class Foo{
T tVar;
public:
Foo(T t) : tVar(t) { }
};
template<class T> class FooDerived:public Foo<T>
{
};
int main()
{
FooDerived<int> d(5);
return 0;
}
当基类构造函数需要外部传递参数才能进行初始化时,派生类必须显式定义构造函数,为基类传递参数;
基类如果不需要传递或者可以不传递参数,派生类可以不用显式定义构造函数。
6、数组地址
X[ii][j] 与 *(X+ii)[j]不等价
因为[]结合性>`*`
改为(*(X+ii))[j]就对了
7、杂
"%%d"
输出为%d
总结
今天刷题也不多,在树上花了比较多时间,明天应加油完成简单排序算法博客。
参考
[1]:https://www.nowcoder.com/questionTerminal/830d1dbe2d1a4481ae4f753d77d2e89a