期末考试前matirx(dddd)开放了部分题库,考完物理和数分后索性开刷,挑战两天干完。不会出现整块的大知识点,只是有一些细节方面要注意的留在这里,不想最后考试在简单的语法问题上浪费时间
随机掉落知识点
-
静态成员变量的使用:在类的内部声明
static int count
,在类的外部初始化int typename::count = value
,通过类的成员函数进行直接操作(成员函数不是static
可以操作static
数据);即可以通过类访问也可以通过对象来访问。(这一点在考试的时候就忘记了痛失两分…)
而静态成员函数呢就只可以访问静态成员(本质是因为静态成员函数没有this指针,找不到对象在哪里),在类外部进行函数实现的时候也是return_type class_name::fun_name(){}
// class Player // { // public: // Player(int id); // ~Player(); // int getId(); // static int getNumberOfObjects(); // private: // int id; // static int numberOfObjects; //count the number of Student objects // };在这里插入代码片 #include<Player.hpp> #include<iostream> using namespace std; int Player::numberOfObjects = 0; Player::Player(int id):id(id){ numberOfObjects++;} Player::~Player(){numberOfObjects--;} int Player::getId(){ return id; } int Player::getNumberOfObjects(){ return numberOfObjects; } //count the number of Student objects
-
关于matrix系统:编写类一般有两个方法,一是在类的内部直接实现,二是在类的外部通过解析符
::
实现。有的时候matrix就要求用解析符(人在屋檐下 -
关于new和delete:在对类内部的数组等数据结构进行初始化时用到nen开辟空间时,一定要注意
this
的问题。比如形式参数是name
实际参数也是name
,如果写成了name = new name [10]
,那么由于内存泄漏,导致segmentfault
-
类的定义时如果写了
const
那么在函数实现的时候也必须要加上const
。例如int getX() const; //类的内部
后面实现的时候int getX () const{ return X }
-
关于
const
:即便是函数参数中的const,也是read-only的,如果尝试修改一般报错为assignment of read-only reference 'x'
-
输出格式问题:如果输出“看样子”和目标输出一样,但是没有通过test,那么一定是复制粘贴的时候出了问题。检查一下,或者甚至直接重新复制。
-
默认参数:默认参数只在类的声明的时候写,类定义的时候不写(外部定义)。
-
++
和--
的运算符重载:首先前加无参数,后加有参数;其次前加返回引用,后加返回值即可。因为前加可以作为左值进行操作,比如int a = 1; ++a = 3; //a++ = 3直接报错:error: lvalue required as left operand of assignment cout<<a<<endl;
a的结果应该是3,因为传出来的值是可以继续当作左值被修改的。
-
关于
map
:map的遍历方式依旧是for(auto it = my_map.begin(); it != my_map.end()); it++)
,map的查找如果失败的话返回值是my_map.end()
-
small but vital tips! 多重遍历的时候,一不小心两层都是
for i
了…然后debug大半天…十分痛苦;大小写和单词拼写每次都会有一些小问题… -
动态二维数组:用new来动态分配空间,直接给出例子,比如我要一个n,m的矩阵。如何分配空间呢?
int** mat = new int* [row]
首先让二维指针指向一个数组,数组中存储的是指针变量。然后进入for(int i=0;i<row;i++)
循环,对于每一行mat[row] = new int [col]
申请int类型的数组。
创建了之后销毁也同样需要注意,由于先后创建的依赖关系,需要后创建的先销毁。所以首先(=for(int i=0; i<row; i++)
对于每一次循环delete [] mat[i]
注意这里是对row进行循环,而不是对col,不然内存会出问题,matrix的报错常常莫名其妙…最后delete [] mat
完成销毁。 -
递归/循环:一定要记得更新下一次递归或者循环的位置。比如递归代入下一次的值,循环更新循环点数值。不然就是原地转圈了噢!
-
名称空间和extern:extern声明使用其他文件中的变量。如果是全局范围,那么某个命名空间内的函数也是可以使用的。在命名空间外实现命名空间内的函数时,需要加上
space_name::