目录
1.必须在初始化列表初始化的成员变量和静态成员变量
const修饰的成员变量:必须在初始化列表初始化
引用类型的成员变量: 必须在初始化列表初始化
静态成员变量(static修饰的):必须在类外初始化
const 和 static 同时修饰的成员变量:可以在类内初始化,不可以在初始化列表初始化,也可以在类外初始化
2.友元函数
友元函数可以看成是类扩展接口的组成部分
友元函数是在类外定义的,没有this指针
友元函数的函数原型位于在类声明中,但并不是类的成员函数,在声明函数原型时,需要使用 friend 关键字。
友元函数的函数定义不需要 friend 关键字和 :: 运算符,和普通非成员函数是一样的
友元函数可以直接访问类的私有成员
通常在运算符重载中使用友元函数的情况是:重载的运算符的第一个参数不是该类的对象
3.类模板
类模板就是一个框架,实际上是建立一个通用类,其数据成员、成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表
类模板实际上是把类模板实例化成一个具体的类!
4.Fibonacci数列
#include <iostream>
using namespace std;
int main() {
// a b cur
// a b cur
int a = 0, b = 1, cur = 0;
int n;
cin >> n;
while (n > cur) //cur更大的时候说明a和b把n夹住了,找到更小的距离
{
cur = a + b;
a = b;
b = cur;
}
cout << min(n - a, b - n) << endl;
return 0;
}
5.引用和指针
本题的E错在:引用底层还是传指针
6.拷贝构造
ACD正确的叙述,会调用拷贝构造
新对象会调用拷贝构造
形参是实参的一份临时拷贝
B选项:用一个已经存在的对象赋值给另一个对象是赋值重载
拷贝构造函数是构造函数,他和构造函数一样没有返回值
该函数的显式参数只有一个(是该类某个对象的引用),但还有一个隐藏的this指针
编译器默认生成的缺省拷贝构造函数是该类的public成员(如果是protected那根本不能在类外使用.............)
拷贝初始化构造函数是把已知对象的数据成员给给正在创建的同类其他对象
注意:赋值构造函数是一个类对象 对 该类其他已经存在的对象 直接赋值
7.函数重载运算符
成员函数运算符重载,运算符的元=参数个数-1
友元函数运算符重载,运算符的元=参数个数
比如成员函数重载+这个二元运算符,由于成员函数有隐藏的this指针,所以只需要一个参数
友元函数没有隐藏的指针 ,所以这个参数列表真的没有任何参数
没有参数你在做什么运算??????????????重载错误
根据上面的分析,肯定是一元运算符,但是前缀还是后缀?
以示区分,后缀的参数列表会写上一个虚参数int,并没有什么实际意义
8.构造函数和析构函数
定义指针变量的时候只会分配空间,不会初始化
所以本题的指针pclassa在创建的时候不会调用构造函数,但是开辟了五个A类对象是要调用构造函数,析构只是delete pclassa(析构一次),所以只是释放了指针,但是指针指向的对象没有释放,这样的析构会造成内存泄漏
这个不能把构造函数设置成私有,那根本new不动
把析构函数设置私有,那么直接创建的对象不能编译器自动调用析构,会报错,而new出来的自己手动delete去调析构,就能释放
9.走方格的方案数
#include <iostream>
using namespace std;
int ans(int n, int m)
{
if (n == 0 || m == 0) //走到边界只有一种走法
return 1;
return ans(n - 1, m) + ans(n, m - 1); //n-1往下走,m-1往右走
}
int main() {
int n, m;
cin >> n >> m;
int res = ans(n, m);
cout << res << endl;
}