大一下学期面向对象程序设计c++复习整理
(考场打印版)
1、char a[50]
字符数组输入输出: char a[50]; cin>>a; cout<<a<<endl; 其它类型数组要用for循环一个个数据输入
字符数组长度要尽量大一点,结束符"\0"。
法一:将char* n_phone改成string ;法二:给n_phone分配空间,然后用strcpy拷贝 void student::setphone(char* phone) { n_phone = new char[strlen(phone) + 1]; strcpy(n_phone, phone); }
字符数组拷贝strcmp()。strcpy在VS2019中记得关闭安全检查(右键属性-c/c++-代码生成-禁用安全检查)
单引号‘用于单个字符’A‘,大于长度1要用双引号。
字符指针数组 const char *pMonth[12] = { "January","February".....}
2、读取‘,’前的字符用 getline进行输入,如下所示
#include <string>
string name;
getline(cin, name, ',');
由于输入字符串中有空格,用 getline进行输入,如下所示
char a[50];
cin.getline(a, 50);
4、求最大最小的初始值时:使用系统最大最小值 INT_MIN INT_MAX DBL_MIN DBL_MAX FLT_MIN FLT_MAX 提交到OJ是加上头文件limits.h
5、CVector c = a+b;拷贝构造
CVector c;
c = a+b;赋值运算符重载。
如果发现~CVector()中的delete注释掉来检查
6、oj提交错误显示CPU运行超时:
原因:死循环或者输入变量个数与题目不匹配。一定要改到return value 0 程序正常结束返回值0;
7、CDate类计今年到这天的天数:
class CDate
{
private:
int year, month, day;
public:
CDate(){}
CDate(int y, int m, int d){.......}
bool isLeapYear(){return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;}
int getDayofYear(){
int i=0, sum = day;
int a[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (isLeapYear())
a[2]++;
// 求日期的天数
for (i = 0; i < month; i++) sum += a[i];
return sum;
}
计算两天的差:类内定义friend int operator -(const stu& x);类外定义如下:
8、#include <algorithm>
数组:t[n]
sort(t, t + n);
9、静态数据成员记得在全局初始化:int Account::interestRate=0;
10、输出指定位数的小数
#include <iomanip>
cout <<fixed<< setprecision(2) << score.Average() << endl;
输出不够位补零
cout << setw(4) << setfill('0') << d.year;
继承与多态:
class CNewId :public COldId {
protected:
char* pId18; CDate issueDay; int validYear;
public:
CNewId(char* pIdVal2, char* pIdVal, char* pNameVal,
CDate& day, CDate& day2, int valid) :COldId(pIdVal, pNameVal, day), issueDay(day2) {
validYear = valid;
pId18 = new char[strlen(pIdVal2)+1];
strcpy(pId18, pIdVal2);
}//本题中余数与校验码的对应关系为1,0,X,9,8,7,6,5,4,3,2这种题记得用数组代替ifelse
}
---------------------------------------------------------------------------------
class CPeople{};
class CStudent :virtual public CPeople{};
class CTeacher :virtual public CPeople{};
class CGradOnWork :public CStudent, public CTeacher{};
CPeople c1(name, sex, age);
c1.print();
CStudent c2(name, sex, age, number, score);
c2.CPeople::print();//访问基类的成员函数时
c2.print();//访问子类自定义的成员函数时(定义时会把基类同名的函数覆盖掉)
CGradOnWork c4(.......);
c4.CPeople::print();
c4.CTeacher::print();
c4.print();
虚函数:
在函数前加上virtual即可:virtual void deposit(int m){} 子类基类里都有这个。
若要求用基类指针数组,使它每一个元素指向每一个派生类对象,做测试:基类指针指向子类对象,统一调用接口。
在基类定义纯虚函数:
virtual void Withdrawal(float amount) = 0;//设为0,其派生类被期待用一个具体的函数来重载。
对成员函数使用关键字final必须声明为virtual虚函数,因为只有虚函数才支持在子类中重写,这时final关键字才会发挥禁止重写的功能。
运算符重载
重载为类成员函数时 参数个数=原操作数个数-1 (后置++、--除外)
重载为友元函数时 参数个数=原操作数个数,且至少应该有一个自定义类型的形参。
friend Complex operator+(Complex& a,Complex& b);//类内定义//类外实现
赋值运算符‘=’、下标运算符‘[]’、成员选择运算符‘->’和函数调用运算符‘()’等不能用友元函数形式重载
类型转换运算符重载:
operator int() return (rp.getX() - lp.getX()) * (lp.getY() - rp.getY());
使用时:CRectangle rect1; cout<< (int)rect1;
赋值运算符重载:
传入的参数需要声明为常量引用。释放实例自身已有的内存,如果在分配新内存前忘记释放自己已有的内存,则会出现内存泄漏。 判断传入参数与当前实例是不是同一个实例,如果是同一个,则立即返回
IO运算符重载
模板
函数模板 找出票数最高的:
求数组中的最大元素和第二大元素(友元)
矩阵乘法(运算符重载)
(格式也没怎么整理了,明天考试,就,加油吧)